枚举最后剩下来的数贪心做,求个hack数据
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define N 1000005
#define mod 1000000007
#define int long long
using namespace std;
int T,n,a[N],ans,sum,l[N],r[N],cnt,tot[N],mx,num,tmp,mxp,lst;
signed main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
a[n+1]=0;
ans=0;
for(int i=1;i<=n;i++){
sum=0;
cnt=0;
for(int j=1;j<=n;j++){
if(a[j]==i&&a[j-1]!=i)l[++cnt]=j;
if(a[j]==i&&a[j+1]!=i)r[cnt]=j;
}
lst=0;
l[++cnt]=n+1,r[cnt]=n;
for(int j=1;j<=cnt;j++){
mx=num=0;
if(lst>=r[j])continue;
else if(lst>=l[j]){
sum=sum+r[j]-lst;
continue;
}
for(int k=lst+1;k<=l[j]-1;k++){
tot[a[k]]++;
num++;
if(tot[a[k]]>mx)mxp=a[k];
mx=max(mx,tot[a[k]]);
}
for(int k=lst+1;k<=l[j]-1;k++)tot[a[k]]=0;
if(mx<=(num+1)/2)sum+=(r[j]-l[j]+1-(num&1)),lst=r[j];
else{
mx=mx-(num-mx);
tmp=l[j]-1;
while(tmp<n&&mx){
tmp++;
if(a[tmp]==mxp)mx++;
else mx--;
}
if(mx)sum-=mx;
lst=tmp;
if(tmp<=r[j])sum+=r[j]-tmp,lst=r[j];
}
}
ans=max(ans,sum);
}
cout<<ans<<endl;
}
}