1. 程式人生 > >CodeForces - 455D 分塊

CodeForces - 455D 分塊

暴力 while uil pan isp force scan make eve

。。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; } /******************** ********************/
View Code

CodeForces - 455D 分塊