ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

acwing1782 Dynamic Rankings (整体二分)

2022-07-16 10:31:47  阅读:138  来源: 互联网

标签:acwing1782 val int Rankings d% Dynamic pos ++ op


和整体二分的模板相比,多了修改操作。
 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有