萌新初学fhq-treap,本地AC提交90pts,悬赏1关注,求调
查看原帖
萌新初学fhq-treap,本地AC提交90pts,悬赏1关注,求调
743811
Shakespeare07楼主2022/9/9 14:07

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int read(){
	int s=0,w=1;char c=getchar();
	while(!isdigit(c)){ if(!isdigit(c)) w=-1;c=getchar();}
	while(isdigit(c)){ s=(s<<3)+(s<<1)+(c^48);c=getchar();}
	return s*w;
}
int m,tot;
int val[N],ch[N][2],rd[N],sz[N];
void pu(int x){
	sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
}
int new_node(int v){
	val[++tot]=v,rd[tot]=rand(),sz[tot]=1;
	return tot;
}
void split(int now,int v,int &x,int &y){
	if(!now) return x=y=0,void();
	if(val[now]<=v) x=now,split(ch[now][1],v,ch[now][1],y);
	else y=now,split(ch[now][0],v,x,ch[now][0]);
	pu(now);
}
int merge(int x,int y){
	if(!x || !y) return x+y;
	if(rd[x]<=rd[y]){
		ch[x][1]=merge(ch[x][1],y);
		pu(x);
		return x;
	}
	ch[y][0]=merge(x,ch[y][0]);
	pu(y);
	return y;
}
int kth(int now,int k){
	while(true){
		if(k<=sz[ch[now][0]]) now=ch[now][0];
		else if(k==sz[ch[now][0]]+1) return now;
		else k-=sz[ch[now][0]]+1,now=ch[now][1];
	}
}
int main(){
	srand(time(0));
	m=read();
	int x,y,z,rt=0;
	while(m--){
		int opt=read(),v=read();
		if(opt==1){
			split(rt,v,x,y);
			rt=merge(merge(x,new_node(v)),y);
		}
		else if(opt==2){
			split(rt,v,x,z);
			split(x,v-1,x,y);
			y=merge(ch[y][0],ch[y][1]);
			rt=merge(merge(x,y),z);
		}
		else if(opt==3){
			split(rt,v-1,x,y);
			printf("%d\n",sz[x]+1);
			rt=merge(x,y);
		}
		else if(opt==4) printf("%d\n",val[kth(rt,v)]);
		else if(opt==5){
			split(rt,v-1,x,y);
			printf("%d\n",val[kth(x,sz[x])]);
			rt=merge(x,y);
		}
		else{
			split(rt,v,x,y);
			printf("%d\n",val[kth(y,1)]);
			rt=merge(x,y);
		}
	}
	return 0;
}
2022/9/9 14:07
加载中...