37分fhq-treap求调
查看原帖
37分fhq-treap求调
538683
Enoch006楼主2024/1/18 09:12
#include <bits/stdc++.h>
#define int long long
#define maxm 2000005
#define maxn 1005
#define inf 0x3f3f3f3f
using namespace std;
mt19937 rnd(time(0));
int t,n,m,cnt,root;
int a[maxm];
struct node{
	int key,sz;//key:二叉搜索树 sz:子树加上自己一共有多少个节点
	int rk;//rk:堆
	int l,r;//左右子树 
}tree[maxm];
void Update(int x){
	tree[x].sz=tree[tree[x].l].sz+tree[tree[x].r].sz+1;
}
int New(int x){
	cnt++;
	tree[cnt]=(node){x,1,rand(),0,0};
	return cnt;
}
void Split(int now,int x,int &L,int &R){
	if(!tree[now].key){
		L=R=0;
		return;
	}
	if(tree[now].key<=x){
		L=now;
		Split(tree[now].r,x,tree[now].r,R);
	}
	else{
		R=now;
		Split(tree[now].l,x,L,tree[now].l);
	}
	Update(now);
	return ;
}
int Merge(int x,int y){
	if(!x||!y)return x+y;
	if(tree[x].rk>tree[y].rk){
		tree[x].r=Merge(tree[x].r,y);
		Update(x);
		return x;
	}
	else{
		tree[y].l=Merge(x,tree[y].l);
		Update(y);
		return y;
	}
}
void Insert(int x){
	int a,b;
	Split(root,x,a,b);
	root=Merge(Merge(a,New(x)),b);
}
void Erase(int x){
	int a,b,c;
	Split(root,x,a,c);
	Split(a,x-1,a,b);
	b=Merge(tree[b].l,tree[b].r);
	root=Merge(Merge(a,b),c);
}
void Rank(int x){
	int a,b;
	Split(root,x-1,a,b);
	cout<<tree[a].sz+1<<"\n";
	root=Merge(a,b);
}
int Kth(int now,int x){
	int rt=now;
	while(!rt){
		if(tree[tree[rt].l].sz+1==x)break;
		else if(x<=tree[tree[rt].l].sz)rt=tree[rt].l;
		else{
			x-=(tree[tree[rt].l].sz+1);
			rt=tree[rt].r;
		}
	}
	return rt;
}
void Pre(int x){
	int a,b;
	Split(root,x-1,a,b);
	cout<<tree[Kth(a,tree[a].sz)].key<<"\n";
	root=Merge(a,b);
}
void Nxt(int x){
	int a,b;
	Split(root,x,a,b);
	cout<<tree[Kth(b,1)].key<<"\n";
	root=Merge(a,b);
}
signed main(){
	cin>>t;
	while(t--){
		int op,z;
		cin>>op>>z;
		if(op==1)Insert(z);
		if(op==2)Erase(z);
		if(op==3)Rank(z);
		if(op==4)cout<<tree[Kth(root,z)].key<<"\n";
		if(op==5)Pre(z);
		if(op==6)Nxt(z);
	}
    return 0;
}
2024/1/18 09:12
加载中...