CodeForces - 455D 分块
Posted walfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 455D 分块相关的知识,希望对你有一定的参考价值。
。。wa了一整天,,,死都找不出bug,后来把x-=l[idx],y-=l[idy]就过了= =
还是分块,用双端队列+数组(map可能会爆内存)维护,每次更新只需要更新两端的队列值和数组里存的值,查询直接暴力查询每个块复杂度O(n*sqrt(n))
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 998244353 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=400,inf=0x3f3f3f3f; int l[N],r[N],belong[N]; int m[maxn][N],a[N]; int n,block,num; deque<int>d[maxn]; void build() { block=(int)sqrt(n+0.5); num=n/block; if(n%block)num++; for(int i=1;i<=num;i++) l[i]=(i-1)*block+1,r[i]=i*block; r[num]=n; for(int i=1;i<=n;i++) { belong[i]=(i-1)/block+1; int x; scanf("%d",&x); m[(i-1)/block+1][x]++; d[(i-1)/block+1].push_back(x); } } void reblock(int x,int y,int id,int p) { int len=d[id].size(); for(int i=0;i<len;i++) a[i]=d[id][i]; for(int i=y;i>=x+1;i--) a[i]=a[i-1]; a[x]=p; d[id].clear(); for(int i=0;i<len;i++) d[id].push_back(a[i]); } void debug() { for(int i=1;i<=num;i++) { for(int j=0;j<d[i].size();j++) cout<<d[i][j]<<" "; cout<<endl; } } int main() { scanf("%d",&n); build(); int q,lastans=0; scanf("%d",&q); while(q--) { // debug(); int x,y,z; scanf("%d",&x); if(x==1) { scanf("%d%d",&x,&y); x=(x+lastans-1)%n+1;y=(y+lastans-1)%n+1; if(x>y)swap(x,y); int idx=belong[x],idy=belong[y]; x-=l[idx];y-=l[idy]; if(idx==idy) { reblock(x,y,idx,d[idx][y]); } else { int p=d[idy][y]; m[idx][d[idy][y]]++;m[idx][d[idx][d[idx].size()-1]]--; m[idy][d[idy-1][d[idy-1].size()-1]]++,m[idy][d[idy][y]]--; for(int i=idy-1;i>=idx+1;i--) { m[i][d[i][d[i].size()-1]]--; m[i][d[i-1][d[i-1].size()-1]]++; } reblock(0,y,idy,d[idy-1][d[idy-1].size()-1]); for(int i=idy-1;i>=idx+1;i--) { d[i].push_front(d[i-1][d[i-1].size()-1]); d[i].pop_back(); } reblock(x,d[idx].size()-1,idx,p); } } else { scanf("%d%d%d",&x,&y,&z); x=(x+lastans-1)%n+1,y=(y+lastans-1)%n+1,z=(z+lastans-1)%n+1; if(x>y)swap(x,y); int ans=0; int idx=belong[x],idy=belong[y]; x-=l[idx],y-=l[idy]; if(idx==idy) { for(int i=x;i<=y;i++) if(d[idx][i]==z) ans++; } else { for(int i=x;i<d[idx].size();i++) if(d[idx][i]==z) ans++; for(int i=0;i<=y;i++) if(d[idy][i]==z) ans++; for(int i=idx+1;i<=idy-1;i++) ans+=m[i][z]; } printf("%d\n",ans); lastans=ans; } } return 0; } /******************** ********************/
以上是关于CodeForces - 455D 分块的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces 455D]Serega and Fun-分块|细节
Codeforces 455D - Serega and Fun (Solved by Square Root Decomposition)