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的主要内容,如果未能解决你的问题,请参考以下文章

luogu2617 Dynamic Rankings

P2617 Dynamic Rankings(带修主席树)

bzoj1901(Zju2112 Dynamic Rankings)

ZOJ 2112 Dynamic Rankings(线段树套treap求动态第K大)

bzoj 1901: Zju2112 Dynamic Rankings

ZOJ 2112 Dynamic Rankings(树状数组+主席树)