【bzoj2821】作诗(Poetize)
2017-12-07 19:08
218 查看
题解:
同蒲公英
同蒲公英
//by sdfzchy #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<cmath> using namespace std; typedef long long LL; const int inf=(1<<30),N=200010,mod=1e9+7; int n,m,c,s ,t ,pos ; struct node { int pos,v; bool operator <(const node& a) const { return v==a.v?pos<a.pos:v<a.v; } }p ; inline int in() { char tmp=getchar(); int res=0,f=1; while((tmp<'0'||tmp>'9')&&tmp!='-')tmp=getchar(); if(tmp=='-') f=-1,tmp=getchar(); while(tmp>='0'&&tmp<='9') res=(res<<1)+(res<<3)+(tmp^48),tmp=getchar(); return res*f; } int siz,bel ,a ,f[2010][2010]; int num ; int ans; void init(int x) { for(int i=(x-1)*siz+1;i<=n;i++) num[a[i]]=0; int tot=0; for(int i=(x-1)*siz+1;i<=n;i++) { num[a[i]]++; if(num[a[i]]!=1&&num[a[i]]%2==1) tot--; else if(num[a[i]]%2==0) tot++; f[x][bel[i]]=tot; } } int gi(int l,int r,int val) { return upper_bound(pos+s[val],pos+t[val],r)-lower_bound(pos+s[val],pos+t[val],l); } int query(int l,int r) { for(int i=l;i<=min(r,bel[l]*siz);i++) num[a[i]]=0; if(bel[l]!=bel[r]) for(int i=(bel[r]-1)*siz+1;i<=r;i++) num[a[i]]=0; int sum=f[bel[l]+1][bel[r]-1]; for(int i=l;i<=min(r,bel[l]*siz);i++) num[a[i]]++; if(bel[l]!=bel[r]) for(int i=(bel[r]-1)*siz+1;i<=r;i++) num[a[i]]++; if(bel[l]==bel[r]) { for(int i=l;i<=min(r,bel[l]*siz);i++) if(num[a[i]]) sum+=(num[a[i]]%2==0),num[a[i]]=0; return sum; } if(bel[r]==bel[l]+1) { for(int i=l;i<=min(r,bel[l]*siz);i++) if(num[a[i]]) sum+=(num[a[i]]%2==0),num[a[i]]=0; for(int i=(bel[r]-1)*siz+1;i<=r;i++) if(num[a[i]]) sum+=(num[a[i]]%2==0),num[a[i]]=0; return sum; } for(int i=l;i<=min(r,bel[l]*siz);i++) if(num[a[i]]) { int tot=gi(bel[l]*siz+1,(bel[r]-1)*siz,a[i]); if(!tot) sum+=(num[a[i]]%2==0); else if(num[a[i]]&1) sum+=tot&1?1:-1; num[a[i]]=0; } for(int i=(bel[r]-1)*siz+1;i<=r;i++) if(num[a[i]]) { int tot=gi(bel[l]*siz+1,(bel[r]-1)*siz,a[i]); // printf("%d %d %d\n",bel[l]*siz+1,(bel[r]-1)*siz,a[i]); if(!tot) sum+=(num[a[i]]%2==0); else if(num[a[i]]&1) sum+=tot&1?1:-1; num[a[i]]=0; } return sum; } bool vis ; int main() { n=in(),c=in(),m=in(); siz=sqrt(n/log2(n)); for(int i=1;i<=n;i++) { a[i]=in();vis[a[i]]=1; p[i]=(node){i,a[i]}; bel[i]=(i-1)/siz+1; } int q=0; for(int i=1;i<=c;i++) if(vis[i]) p[n+(++q)]=(node){inf,i}; sort(p+1,p+n+q+1); for(int i=1;i<=n+q;i++) pos[i]=p[i].pos; for(int i=1;i<=n+q;i++) { if(!s[p[i].v]) s[p[i].v]=i; t[p[i].v]=i; } for(int i=1;i<=bel ;i++) init(i); for(int i=1,l,r;i<=m;i++) { l=(in()+ans)%n+1; r=(in()+ans)%n+1; if(l>r) swap(l,r); printf("%d\n",ans=query(l,r)); } return 0; }
相关文章推荐
- BZOJ2821 作诗(Poetize) 【分块】
- [BZOJ 2821] 作诗(Poetize) 【分块】
- 【bzoj2821】作诗(Poetize) 分块
- bzoj2821[作诗(Poetize)]
- [bzoj] 2821 作诗(Poetize) || 分块
- 【bzoj2821】作诗(Poetize)
- BZOJ 2821: 作诗(Poetize)|分块
- BZOJ_2821_作诗(Poetize)_分块
- bzoj2821: 作诗(Poetize)【分块】
- 【分块】BZOJ2821 作诗(Poetize)
- BZOJ 2821 作诗(Poetize) 分块
- BZOJ 2821 作诗(Poetize) 分块
- BZOJ2821: 作诗(Poetize)
- BZOJ 2821 作诗(Poetize) 分块
- bzoj 2821: 作诗(Poetize)
- BZOJ 2821: 作诗(Poetize)( 分块 )
- BZOJ 2821 作诗(Poetize) 分块
- BZOJ 2821: 作诗(Poetize) | 分块
- BZOJ 2821 作诗(Poetize)
- bzoj 2821: 作诗(Poetize) (分块)