70分求调
查看原帖
70分求调
1463301
qinzilin121113楼主2024/10/24 22:47
#include<bits/stdc++.h>
using namespace std;
int dp[1000000],a[1000000],n,mx1,to[1000000],ft[1000000];
vector<int> vct[600000];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        vct[a[i]].push_back(i);
    }if(n>5000){
        int cnt=0,mx2=0;
        for(int i=1;i<=n;i++){
            to[a[i]]++;
            mx2=max(mx2,to[a[i]]);
        }if(mx2==2){
            for(int i=2;i<=n;i++){
                ft[i-1]=max(ft[i-2],dp[i-1]);
                int j1=-1;
                if(vct[a[i]][1]==i) j1=vct[a[i]][0];
                if(j1!=-1) dp[i]=2;
                dp[i]+=ft[max(j1-1,0)];
                mx1=max(mx1,dp[i]);
            }cout<<mx1;
            return 0;
        }for(int i=1;i<=1000000;i++){
            if(to[i]>=2){
                cnt+=2;
            }
        }cout<<cnt;
        return 0;        
    }
    for(int i=2;i<=n;i++){
        int j1=-1;
        for(int j=i-1;j>=1;j--){
            if(a[j]==a[i]){
                j1=j;
                break;
            }
        }if(j1!=-1) dp[i]=2;
        int mx=0;
        for(int j=j1-1;j>=1;j--){
            if(a[j]!=a[i]){
                mx=max(mx,dp[j]);
            }
        }dp[i]+=mx;
        mx1=max(mx1,dp[i]);
    }cout<<mx1;
    return 0;
}
2024/10/24 22:47
加载中...