其他分享
首页 > 其他分享> > acwing1782 Dynamic Rankings (整体二分)

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