Dynamic Rankings
Posted hikigaya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dynamic Rankings相关的知识,希望对你有一定的参考价值。
板子题
用的整体二分
唯一要注意的是别总手误打错变量
最近总犯这样sb错误,我佛了
#include<bits/stdc++.h> using namespace std; const int N=1e5+7; const int inf=0x3f3f3f3f; struct node{ int op,x,y,z; }q[3*N],lq[3*N],rq[3*N]; int n,m,t,a[N],c[N],ans[N],num; void change(int x,int y){ while(x<=n){ c[x]+=y; x+=x&-x; } } int ask(int x){ int y=0; while(x){ y+=c[x]; x-=x&-x; } return y; } void solve(int l,int r,int st,int ed){ if(st>ed)return; if(l==r){ for(int i=st;i<=ed;i++) if(q[i].op>0)ans[q[i].op]=l; return; } int mid=(l+r)>>1; int lt=0,rt=0; for(int i=st;i<=ed;i++){ if(q[i].op<1){ if(q[i].z<=mid)change(q[i].x,q[i].y),lq[++lt]=q[i]; else rq[++rt]=q[i]; } else { int cnt=ask(q[i].y)-ask(q[i].x-1); if(cnt>=q[i].z)lq[++lt]=q[i]; else q[i].z-=cnt,rq[++rt]=q[i]; } } for(int i=ed;i>=st;--i){ if(q[i].op<1&&q[i].z<=mid)change(q[i].x,-q[i].y); } for(int i=1;i<=lt;i++)q[st+i-1]=lq[i]; for(int i=1;i<=rt;i++)q[st+lt+i-1]=rq[i]; solve(l,mid,st,st+lt-1); solve(mid+1,r,st+lt,ed); } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); q[++t].op=0; q[t].x=i; q[t].z=a[i]; q[t].y=1; } for(int i=1;i<=m;i++){ char ch[2]; int x,y; scanf("%s",ch); if(ch[0]==‘C‘){ scanf("%d%d",&x,&y); q[++t].op=-1; q[t].x=x; q[t].z=a[x]; q[t].y=-1; q[++t].op=0; q[t].x=x; q[t].z=y; q[t].y=1; a[x]=y; } else { scanf("%d%d%d",&q[t+1].x,&q[t+1].y,&q[t+1].z); q[++t].op=++num; } } solve(-10,10,1,t); for(int i=1;i<=num;i++) printf("%d ",ans[i]); return 0; }
以上是关于Dynamic Rankings的主要内容,如果未能解决你的问题,请参考以下文章
bzoj1901(Zju2112 Dynamic Rankings)
ZOJ 2112 Dynamic Rankings(线段树套treap求动态第K大)