社区讨论

FHQ treap TLE 求调

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lrpx8xx9
此快照首次捕获于
2024/01/23 13:34
2 年前
此快照最后确认于
2024/01/23 16:16
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int n,root,tot;
int siz[maxn+5],val[maxn+5],key[maxn+5],lc[maxn+5],rc[maxn+5];
int newnode(int v){
	val[++tot]=v,key[tot]=rand(),siz[tot]=1;
	return tot;
}
void update(int x){
	siz[x]=siz[lc[x]]+siz[rc[x]]+1;
}
void split(int x,int k,int &a,int &b){
	if(x==0){
		a=b=0;
		return;
	}
	if(val[x]<=k){
		a=x;
		split(rc[a],k,rc[a],b);
		update(a);
	}
	else{
		b=x;
		split(lc[b],k,a,lc[b]);
		update(b);
	}
}
int merge(int a,int b){
	if(a==0||b==0){
		return a+b;
	}
	if(key[a]<key[b]){
		rc[a]=merge(rc[a],b);
		update(a);
		return a;
	}
	else{
		lc[b]=merge(a,lc[b]);
		update(b);
		return b;
	}
}
void insert(int x){
	int a,b;
	split(root,x,a,b);
	root=merge(merge(a,newnode(x)),b);
}
void del(int x){
	int a,b,c;
	split(root,x,a,c);
	split(a,x-1,a,b);
	b=merge(lc[b],rc[b]);
	root=merge(merge(a,b),c);
}
int getrank(int x){
	int a,b,ans;
	split(root,x-1,a,b);
	ans=siz[a]+1;
	root=merge(a,b);
	return ans;
}
int getvalue(int x,int k){
	if(siz[lc[x]]+1==k){
		return val[x];
	}
	else if(siz[lc[x]]>k){
		return getvalue(lc[x],k);
	}
	else{
		return getvalue(rc[x],k-siz[lc[x]]-1);
	}
}
int getpre(int x){
	int a,b,p,ans;
	split(root,x-1,a,b);
	p=a;
	while(rc[p]!=0){
		p=rc[p];
	}
	ans=val[p];
	root=merge(a,b);
	return ans;
}
int getnext(int x){
	int a,b,p,ans;
	split(root,x,a,b);
	p=b;
	while(lc[p]!=0){
		p=lc[p];
	}
	ans=val[p];
	root=merge(a,b);
	return ans;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int op,x;
		scanf("%d %d",&op,&x);
		switch(op){
			case 1:
				insert(x);
				break;
			case 2:
				del(x);
				break;
			case 3:
				printf("%d\n",getrank(x));
				break;
			case 4:
				printf("%d\n",getvalue(root,x));
				break;
			case 5:
				printf("%d\n",getpre(x));
				break;
			case 6:
				printf("%d\n",getnext(x));
				break;
		}
	}
	return 0;
}

回复

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

正在加载回复...