Treap 求调
查看原帖
Treap 求调
638206
_Dolphin_楼主2023/11/8 18:51
#include<bits/stdc++.h>
#define afor(x,y,z) for(int x=y;x<=z;x++)
#define bfor(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
typedef const int cint;
cint N=100010;
struct Treap{
	int root,tot,lson[N],rson[N],val[N],key[N],siz[N],cnt[N];
	int newnode(int x) {
		val[++tot]=x;
		key[tot]=rand()+1;
		siz[tot]=cnt[tot]=1;
		return tot;
	}
	void update(int x) {
		siz[x]=siz[lson[x]]+siz[rson[x]]+cnt[x];
	}
	void zig(int &x) {
		int y=lson[x];
		lson[x]=rson[y],rson[y]=x,x=y;
		update(rson[x]),update(x);
	}
	void zag(int &x) {
		int y=rson[x];
		rson[x]=lson[y],lson[y]=x,x=y;
		update(lson[x]),update(x);
	}
	void insert(int &x,int y) {
		if(!x) x=newnode(y);
		else if(val[x]==y) cnt[x]++,siz[x]++;
		else if(val[x]>y) {
			insert(lson[x],y);
			if(key[lson[x]]>key[x]) zig(x);
		}
		else {
			insert(rson[x],y);
			if(key[rson[x]]>key[x]) zag(x);
		}
		update(x);
	}
	void delate(int &x,int y) {
		if(!x) return;
		if(val[x]==y) {
			if(cnt[x]>1) {
				cnt[x]--,siz[x]--;
				return;
			}
			if(lson[x]||rson[x]) {
				if(!rson[x]||key[lson[x]]>key[rson[x]])
					zig(x),delate(rson[x],y);
				else zag(x),delate(lson[x],y);
				update(x);
			}
			else x=0;
		}
		else if(val[x]>y) delate(lson[x],y);
		else delate(rson[x],y);
		if(x) update(x);
	}
	int getrank(int x,int y) {
		if(!x) return 1;
		if(val[x]==y) return siz[lson[x]]+1;
		if(val[x]>y) return getrank(lson[x],y);
		return siz[lson[x]]+cnt[x]+getrank(rson[x],y);
	}
	int getval(int x,int y) {
		if(!x) return 0;
		if(siz[lson[x]]+cnt[x]<y)
			return getval(rson[x],y-siz[lson[x]]-cnt[x]);
		else if(lson[x]>=y) return getval(lson[x],y);
		else return val[x];
	}
	int getpre(int x,int y) {
		if(!x) return -0x7fffffff;
		if(val[x]<y) return max(val[x],getpre(rson[x],y));
		else return getpre(lson[x],y);
	}
	int getnxt(int x,int y) {
		if(!x) return 0x7fffffff;
		if(val[x]>y) return min(val[x],getnxt(lson[x],y));
		else return getnxt(rson[x],y);
	}
} tr;
int n,opt,x;
int main() {
	scanf("%d",&n);
	afor(i,1,n) {
		scanf("%d%d",&opt,&x);
		if(opt==1) tr.insert(tr.root,x);
		else if(opt==2) tr.delate(tr.root,x);
		else if(opt==3) printf("%d\n",tr.getrank(tr.root,x));
		else if(opt==4) printf("%d\n",tr.getval(tr.root,x));
		else if(opt==5) printf("%d\n",tr.getpre(tr.root,x));
		else printf("%d\n",tr.getnxt(tr.root,x));
	}
	return 0;
}
2023/11/8 18:51
加载中...