暴力+前缀和——cf1335E

/*
统计1-200的前缀和,然后枚举i为第一段的右端点,可以直接推出第三段的左端点,然后在中间那一块找最大值就行
*/
#include<bits/stdc++.h>
using namespace std;
#define N 200005

int n,a[N],sum[205][N];
vector<int>p[205];

int main(){
    int t;cin>>t;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=200;i++){
            for(int j=1;j<=n;j++)
                if(a[j]==i)sum[i][j]=sum[i][j-1]+1;
                else sum[i][j]=sum[i][j-1];
        }
        for(int i=1;i<=n;i++)
            p[a[i]].push_back(i);
        int ans=0;
        for(int i=1;i<=n;i++){
            int s=p[a[i]].size(); 
            int p1=lower_bound(p[a[i]].begin(),p[a[i]].end(),i)-p[a[i]].begin();
            int p2=s-1-p1; 
            if(p2<p1)continue;
            if(p2==p1){
                ans=max(ans,2*p1+1);
                continue;
            }
            int l=i,r=p[a[i]][p2];
            int Max=0;
            for(int i=1;i<=200;i++)
                Max=max(Max,sum[i][r-1]-sum[i][l]);
            ans=max(ans,Max+2*(p1+1));
        }
        
        cout<<ans<<'\n';
        
        for(int i=1;i<=200;i++){
            p[i].clear();
            for(int j=1;j<=n;j++)sum[i][j]=0;
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/12735031.html