acwing1782 Dynamic Rankings (整体二分)
作者:互联网
和整体二分的模板相比,多了修改操作。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10,INF=1e9; 4 int n,m,t,c[N],ans[N],b[N]; 5 struct node{ 6 int op,x,y,z; 7 }q[N*3],rq[N*3],lq[N*3]; 8 9 void change(int x,int y){ 10 for(;x<=n;x+=x&(-x)) c[x]+=y; 11 } 12 13 int ask(int x){ 14 int sum=0; 15 for(;x;x-=x&(-x)) sum+=c[x]; 16 return sum; 17 } 18 19 void solve(int L,int R,int l,int r){ 20 if(l>r) return ; 21 if(L==R){ 22 for(int i=l;i<=r;i++){ 23 if(q[i].op>0) ans[q[i].op]=L; 24 } 25 return ; 26 } 27 int mid=(L+R)>>1; 28 int lt=0,rt=0; 29 for(int i=l;i<=r;i++){ 30 if(q[i].op==0){ 31 if(q[i].y<=mid) change(q[i].x,1),lq[++lt]=q[i]; 32 else rq[++rt]=q[i]; 33 } 34 else if(q[i].op==-1){ 35 if(q[i].y<=mid) change(q[i].x,-1),lq[++lt]=q[i]; 36 else rq[++rt]=q[i]; 37 } 38 else{ 39 int cnt=ask(q[i].y)-ask(q[i].x-1); 40 if(cnt>=q[i].z) lq[++lt]=q[i]; 41 else q[i].z-=cnt,rq[++rt]=q[i]; 42 } 43 } 44 for(int i=r;i>=l;i--){//还原树状数组 45 if(q[i].op==0&&q[i].y<=mid) change(q[i].x,-1); 46 if(q[i].op==-1&&q[i].y<=mid) change(q[i].x,1); 47 } 48 for(int i=1;i<=lt;i++) q[l+i-1]=lq[i]; 49 for(int i=1;i<=rt;i++) q[l+lt+i-1]=rq[i]; 50 solve(L,mid,l,l+lt-1);solve(mid+1,R,l+lt,r); 51 } 52 53 int main(){ 54 scanf("%d%d",&n,&m); 55 for(int i=1;i<=n;i++){ 56 scanf("%d",&b[i]); 57 q[++t].op=0,q[t].x=i,q[t].y=b[i]; 58 } 59 char a;int tot=0; 60 for(int i=1;i<=m;i++){ 61 cin>>a; 62 if(a=='Q'){ 63 int l,r,k; 64 scanf("%d%d%d",&l,&r,&k); 65 q[++t].op=++tot,q[t].x=l,q[t].y=r,q[t].z=k; 66 } 67 else{//将一次修改看作两次操作 68 int pos,val; 69 scanf("%d%d",&pos,&val); 70 q[++t].op=-1,q[t].x=pos,q[t].y=b[pos]; 71 q[++t].op=0,q[t].x=pos,q[t].y=val; 72 b[pos]=val;//注意要在原序列上修改 73 } 74 } 75 solve(0,INF,1,t); 76 for(int i=1;i<=tot;i++) printf("%d\n",ans[i]); 77 return 0; 78 }
标签:acwing1782,val,int,Rankings,d%,Dynamic,pos,++,op 来源: https://www.cnblogs.com/yhxnoerror/p/16483585.html