CF1990C Mad MAD Sum 题解

CF1990C Mad MAD Sum

好题。考虑操作一次之后序列的性质,不难发现存在单调性。因为定义为出现至少两次的最大值,而从左到右最大值是可以继承的,所以单升不降。

然后,手玩一下发现之后的操作相当于把整个序列向后移动一位,左边使用 \(0\) 自动补齐。特别的,如果一个元素数量不足 \(2\) 个,会被左边满足要求的最大值替代。根据位置求出每个元素被计算的次数累加即可。

#include <bits/stdc++.h>
using namespace std;
long long t,n,a[300000],c[300000];
int main()
{
	scanf("%lld",&t);
	while(t--)
	   {
	   	long long sum=0,mx=0;
	   	scanf("%lld",&n);
	   	for(int i=1;i<=n;i++)c[i]=0;
	   	for(int i=1;i<=n;i++)
	   	    {
		    scanf("%lld",&a[i]),sum+=a[i];
		    c[a[i]]++;
		    if(c[a[i]]>=2)mx=max(mx,a[i]);
		    a[i]=mx;
		    }
		mx=0;
	   	for(int i=1;i<=n;i++)c[i]=0;
		for(int i=1;i<=n;i++)
		    if(a[i]!=0)
		       {
		       c[a[i]]++;
		       if(c[a[i]]>=2)mx=max(mx,a[i]);
			   if((a[i]==mx)||(a[i]==a[i+1]))sum+=a[i]*(n-i+1);
			   else sum+=(a[i]+mx*(n-i));
		       }
		printf("%lld\n",sum);
	   }
	return 0;
}
posted @ 2025-02-18 12:26  w9095  阅读(21)  评论(0)    收藏  举报