P11233
我们可以设
发现
然后只有一个前缀 max 和同颜色前缀 max。
一个我也不知道对不对但是过了大样例的代码:
#include<bits/stdc++.h>
using namespace std;
int a[200005],n,Tc;
typedef long long ll;
ll f[200005],mx[1000005],Mx;
int main(){
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
scanf("%d",&Tc);
while(Tc--){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
ll ans=0;
for(int i=1;i<n;i++)if(a[i]==a[i+1])ans+=a[i];
n=unique(a+1,a+n+1)-a-1;
Mx=0;
memset(mx,-0x3f,sizeof(mx));
for(int i=1;i<=n;i++){
f[i]=max(Mx,mx[a[i]]+a[i]);
Mx=max(Mx,f[i]);
mx[a[i-1]]=max(mx[a[i-1]],f[i]);
}
printf("%lld\n",Mx+ans);
}
return 0;
}