社区讨论

FHQTreap求调 44pts

P3369【模板】普通平衡树参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo0ztfdp
此快照首次捕获于
2023/10/22 12:53
2 年前
此快照最后确认于
2023/11/02 12:23
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int ls[N],rs[N],val[N],pri[N],size[N],cnt,root=0,n,opt;
int inline read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void update(int p){
	size[p]=1+size[ls[p]]+size[rs[p]];
}
int new_node(int v){
	size[++cnt]=1;
	val[cnt]=v;
	pri[cnt]=rand();
	return cnt;
}
void split(int now,int k,int &x,int &y){
	if(!now)x=y=0;
	else{
		if(val[now]<=k){
			x=now;
			split(rs[now],k,rs[now],y); 
		}
		else{
			y=now;
			split(ls[now],k,x,ls[now]);
		}
		update(now);
	} 
}
int merge(int x,int y){
	if(!x || !y)return x+y;
	if(pri[x]<pri[y]){
		rs[x]=merge(rs[x],y);
		update(x);
		return x;
	}
	else{
		ls[y]=merge(x,ls[y]);
		update(y);
		return y;
	}
}
int kth(int now,int k){
	while(1){
		if(k<=size[ls[now]])now=ls[now];
		else if(k==size[ls[now]]+1)return now;
		else{
			k-=size[ls[now]]+1;
			now=rs[now]; 
		}
	}
}
int main() {
	srand((unsigned)time(NULL));
	n=read();
	int x,y,a,z;
	for(int i=1;i<=n;i++){
		opt=read();a=read();
		switch(opt){
			case 1:{
				split(root,a,x,y);
				root=merge(merge(x,new_node(a)),y);
				break;
			}
			case 2:{
				split(root,a,x,z);
				split(root,a-1,x,y);
				y=merge(ls[y],rs[y]);
				root=merge(merge(x,y),z);
				break;
			}
			case 3:{
				split(root,a-1,x,y);
				printf("%d\n",size[x]+1);//cout<<<<endl;
				root=merge(x,y);
				break;
			}
			case 4:{
				printf("%d\n",val[kth(root,a)]);//cout<<<<endl;
				break;
			}
			case 5:{
				split(root,a-1,x,y);
				printf("%d\n",val[kth(x,size[x])]);//cout<<<<endl;
				root=merge(x,y);
				break;
			}
			case 6:{
				split(root,a,x,y);
				printf("%d\n",val[kth(y,1)]);
				root=merge(x,y);
				break;
			}
		}
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...