当前位置:首页 > 题解目录 > 正文内容

【题解】前缀最大值

亿万年的星光3年前 (2022-10-20)题解目录2571

【题目描述】

求一个数列的所有前缀最大值之和。
即:给出长度为n的数列a[i],求出对于所有1<=i<=n,max(a[1],a[2],...,a[i])的和。
比如,有数列:666 304 692 188 596,前缀最大值为:666 666 692 692 692,和为3408。
对于每个位置的前缀最大值解释如下:对于第1个数666,只有一个数,一定最大;对于第2个数,求出前两个数的最大数,还是666;对于第3个数,求出前3个数的最大数是692……其余位置依次类推,最后求前缀最大值得和。

由于读入较大,数列由随机种子生成。
其中a[1]=x,a[i]=(379*a[i-1]+131)%997。

【输入描述】

一行两个正整数n,x,分别表示数列的长度和随机种子。(n<=100000,x<997)

【输出描述】

一行一个正整数表示该数列的前缀最大值之和。

【样例输入】

5 666
Copy


【样例输出】

3408

【提示】

数列为{666,304,692,188,596},前缀最大值为{666,666,692,692,692},和为3408。



【参考代码】

#include<bits/stdc++.h>
using namespace std;
int n,x,a[100001],k,sum;
int main(){
	cin>>n>>x;
	sum = k = a[1] = x;
	for(int i=2;i<=n;i++) {
		a[i]=(379*a[i-1]+131)%997;
	}
	for(int i=2;i<=n;i++){
		if(k > a[i]) {
			a[i] = k;
		}else{
			k = a[i];
		}
		sum += a[i];
	}
	cout<<sum;
	return 0;
}


写法二:

#include<bits/stdc++.h> 
using namespace std;
int n,x,maxx;
long long s;
int main()
{
	scanf("%d %d",&n,&x);
	maxx=x;s=x;
	for(int i=2;i<=n;i++)
	{
		x=(379*x+131)%997;
		maxx=max(maxx,x);
		s+=maxx;
	}
	printf("%lld",s);
	return 0;
}


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    【题解】剔除相关数

    【题目描述】一个数与另一个数如果含有相同数字和个数的字符,则称两数相关。现有一堆乱七八糟的整数,里面可能充满了彼此相关的数,请你用一下手段,自动地将其剔除。【输入描述】每组数据前有一个N(<10...

    【题解】链表操作

    【题目描述】给定一个N个数的数组,M次操作,每次操作为下列操作之一。求最后的数组。操作1:在第X个数之后插入一个数Y。操作2:删除第X个数。操作3:对区间[X,Y]进行排序。操作4:对区间[X,Y]进...

    【题解】飞奔的马

    【题目描述】农场里的马,在草场开心地吃着牧草,直到天色晚了,牧马的人会将马依次按号牌大小,依次放入相应的位置。但是这马总是打乱了顺序,于是牧马人都会想办法把这些马都排好:每次从最前面开始,然后与后面的...

    【算法】走迷宫

    【题目描述】一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜...

    亲和数

    【题目描述】自然数a的因子是指能整除a的所有自然数,但不含a本身。例如12的因子为:1,2,3,4,6。若自然数a的因子之和为b,而且b的因子之和又等于a,则称a,b为一对“亲和数” 。求最小的一对亲...

    【题解】高精度除法

    【题目描述】高精除以高精,求它们的商和余数。【输入描述】输入两个低于300位的正整数。【输出描述】输出商和余数。【样例输入】12313123184575776878979876423245678643...