1 条题解
-
0
#include<bits/stdc++.h> using namespace std; constexpr int N=5e5+5,M=2e3+5; int n,m,lstans,sz,l,r; int a[N],x[N],pos[N],cnt[N]; int mst[M][M],blk[N],st[M],en[M]; vector<int>v[N]; int query(int l,int r){ int ans=1; if(blk[l]==blk[r]){ for(int i=l;i<=r;i++) cnt[a[i]]=0; for(int i=l;i<=r;i++){ cnt[a[i]]++; ans=max(ans,cnt[a[i]]); } } else{ if(blk[l]+1<=blk[r]-1) ans=mst[blk[l]+1][blk[r]-1]; for(int i=l;i<=en[blk[l]];i++){ int res=pos[i]+ans; for(;res<v[a[i]].size()&&v[a[i]][res]<=r;){ ans++; res++; } } for(int i=r;i>=st[blk[r]];i--){ int res=pos[i]-ans; for(;res>=0&&v[a[i]][res]>=l;){ ans++; res--; } } } return ans; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; sz=720; for(int i=1;i<=n;i++){ cin>>a[i]; x[i]=a[i]; blk[i]=(i+sz-1)/sz; if(!st[blk[i]]) st[blk[i]]=i; en[blk[i]]=i; } sort(x+1,x+n+1); int tmp=unique(x+1,x+n+1)-(x+1); for(int i=1;i<=n;i++){ a[i]=lower_bound(x+1,x+tmp+1,a[i])-x; pos[i]=v[a[i]].size(); v[a[i]].push_back(i); } for(int i=1;i<=blk[n];i++){ memset(cnt,0,sizeof(cnt)); for(int j=i;j<=blk[n];j++){ mst[i][j]=mst[i][j-1]; for(int k=st[j];k<=en[j];k++){ cnt[a[k]]++; mst[i][j]=max(mst[i][j],cnt[a[k]]); } } } for(int i=1;i<=m;i++){ cin>>l>>r; l^=lstans,r^=lstans; if(l>r) swap(l,r); lstans=query(l,r); cout<<lstans<<endl; } }
- 1
信息
- ID
- 12513
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者