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

【题解】前缀最大值

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

【题目描述】

求一个数列的所有前缀最大值之和。
即:给出长度为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;
}


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

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

分享给朋友:

相关文章

【题解】区间和

1.区间和(sum.cpp)【描述】输入一个整数Q,进行Q次询问,每次给定两个整数l和r,每一次输出l~r中所有平方数的和 % 1000000007【输入】第一行是一个整数Q后面的Q行每行有...

【题解】车辆管理

【题目描述】交通管理局长氓氓现在需要一个管理汽车的系统,每一辆汽车都有许多信息需要去记录。 首先,每一辆汽车都有一个独一无二的车牌号 S,车牌号由 7 个字符组成。 然后,对于每一辆车要记录它的排...

【题解】周末舞会

【题目描述】假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等...

【题解】同学的等待

【题目描述】同学们下课后去食堂,每个人都需要一段时间去点菜。然而,某些同学点菜时间太长了。同学们对于等待很烦躁:他们希望,能尽量少的花时间等待。(同学数<=100000),(0<=点菜耗时...

【题解】2020-T1 优秀的拆分

【题目描述】一般来说,一个正整数可以拆分成若干个正整数的和。例如,1=1,10=1+2+3+4等。对于正整数n的一种特定拆分,当且仅当在这种拆分下,n被分解为若干个不同的2的正整数次幂。注意,一个数x...

【题解】计数2的N次方

【题目描述】任意给定一个正整数N(N≤100),计算2的n次方的值。【输入描述】输入一个正整数N。【输出描述】输出2的N次方的值。【样例输入】5【样例输出】32【参考答案】#include<io...