AC但是似乎是假做法
查看原帖
AC但是似乎是假做法
522981
海洋守卫者楼主2024/10/26 22:15

DP+离谱优化

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int MAXN=2e5+7;
long long n,T,a[MAXN],s[MAXN],f[MAXN],l[MAXN],ans,t[1000005];
int main()
{
	//freopen("color.in","r",stdin);
	//freopen("color.out","w",stdout);
	scanf("%lld",&T);
	while(T--)
	{
		memset(f,0,sizeof f);
		memset(t,0,sizeof t);
		scanf("%lld",&n);
		for(int i=1;i<=n;i++)scanf("%lld",a+i),l[i]=t[a[i]],t[a[i]]=i;
		for(int i=2;i<=n;i++)f[i]=s[i]=s[i-1]+(a[i]==a[i-1]?a[i]:0);
		for(int i=2;i<=n;i++)
		{
			//Form1
			f[i]=max(f[i],f[i-1]+(a[i]==a[i-1]?a[i]:0));
			for(int j=l[i],times=0;j;j=l[j])
			{
				if(f[i]<=f[j+1]+s[i-1]-s[j+1]+a[i])times=0,f[i]=f[j+1]+s[i-1]-s[j+1]+a[i];
				else if((++times)>=100)break;
			}
		}
		ans=0;
		for(int i=1;i<=n;i++)ans=max(ans,f[i]);
		printf("%lld\n",ans);
	}
	return 0;
}
2024/10/26 22:15
加载中...