CodeForces-811C Vladik and Memorable Trip
阿新 • • 發佈:2018-12-11
預處理+dp
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; const int N=5000+10; int d[N]; int sum[N]; int a[N]; int r[N],l[N]; int val[N]; int n; int main() { scanf("%d",&n); for(int i=0;i<N;i++) r[i]=0,l[i]=n+1; sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(l[a[i]]==n+1) sum[i]=sum[i-1]^a[i]; else sum[i]=sum[i-1]; l[a[i]]=min(l[a[i]],i); r[a[i]]=max(r[a[i]],i); } for(int i=0;i<N;i++) if(r[i]) { int ll=l[i],rr=r[i]; int lm,rm; lm=rm=(ll+rr)>>1; while(1) { if(lm>ll) { ll=min(l[a[lm]],ll); rr=max(r[a[lm]],rr); lm--; } if(rm<rr) { ll=min(l[a[rm]],ll); rr=max(r[a[rm]],rr); rm++; } if(rm==rr&&lm==ll) break; } val[i]=sum[rr]^sum[ll-1]; l[i]=ll;r[i]=rr; } memset(d,-1,sizeof(d)); int mma=0; for(int i=1;i<=n;i++) { int t=a[i]; if(r[t]>i) continue; int ma=0; for(int j=1;j<l[t];j++) ma=max(ma,d[j]); d[i]=max(ma+val[t],mma); mma=max(mma,d[i]); } printf("%d\n",mma); return 0; }