FHQTreap求调,WA#14,MLE#4-#12
查看原帖
FHQTreap求调,WA#14,MLE#4-#12
752257
Miangoa楼主2024/1/26 22:13
#include<bits/stdc++.h>
#define fi first
#define se second

using namespace std;

int n;
typedef pair<int,int> p2;
typedef pair<pair<int,int>,int> p3;
struct node {
	int t[2],v,h,c,s;
	void init(int val) {
		v=val,t[0]=t[1]=-1,c=s=1,h=rand();
	}
};
struct treap {
	node num[100010];
	int root=-1,cnt;
	void upl(int p) {
		num[p].s=num[num[p].t[0]].s+num[num[p].t[1]].s+num[p].c;
	}
	int newnode(int v) {
		num[++cnt].init(v);
		return cnt;
	}
	p2 splv(int p,int k) {
		if(p==-1)
			return make_pair(-1,-1);
		if(num[p].v<=k) {
			p2 ret=splv(num[p].t[1],k);
			num[p].t[1]=ret.fi;
			upl(p);
			return make_pair(p,ret.se);
		} else {
			p2 ret=splv(num[p].t[0],k);
			num[p].t[0]=ret.se;
			upl(p);
			return make_pair(ret.fi,p);
		}
	}
	p3 splr(int p,int r) {
		if(p==-1)
			return make_pair(make_pair(-1,-1),-1);
		if(r<=num[num[p].t[0]].s) {
			p3 ret=splr(num[p].t[0],r);
			num[p].t[0]=ret.fi.se;
			upl(p);
			return make_pair(make_pair(ret.fi.fi,p),ret.se);
		}
		if(r<=num[num[p].t[0]].s+num[p].c) {
			p3 ret=make_pair(make_pair(num[p].t[0],num[p].t[1]),p);
			num[p].t[0]=num[p].t[1]=-1;
			return ret;
		} else {
			p3 ret=splr(num[p].t[1],r);
			num[p].t[1]=ret.fi.fi;
			upl(p);
			return make_pair(make_pair(p,ret.fi.se),ret.se);
		}
	}
	int mer(int l,int r) {
		if(l==-1)
			return r;
		if(r==-1)
			return l;
		if(num[l].h<=num[r].h) {
			num[l].t[1]=mer(num[l].t[1],r);
			upl(l);
			return l;
		}
		if(num[l].h>num[r].h) {
			num[r].t[0]=mer(l,num[l].t[0]);
			upl(r);
			return r;
		}
	}
	void ins(int v) {
		p2 r=splv(root,v);
		p2 l=splv(r.fi,v-1);
		if(l.se==-1) {
			l.se=newnode(v);
		} else {
			num[l.se].c++;
			upl(l.se);
		}
		root=mer(mer(l.fi,l.se),r.se);
	}
	void del(int v) {
		p2 r=splv(root,v);
		p2 l=splv(r.fi,v-1);
		num[l.se].c--;
		upl(l.se);
		if(num[l.se].c==0)
			l.se=-1;
		root=mer(mer(l.fi,l.se),r.se);
	}
	int quer(int v) {
		p2 a=splv(root,v-1);
		int ret=num[a.fi].s+1;
		root=mer(a.fi,a.se);
		return ret;
	}
	int quev(int r) {
		p3 a=splr(root,r);
		int ret=num[a.se].v;
		root=mer(mer(a.fi.fi,a.se),a.fi.se);
		return ret;
	}
	int quef(int v) {
		p2 a=splv(root,v-1);
		int ret=a.fi;
		while(num[ret].t[1]!=-1)
			ret=num[ret].t[1];
		root=mer(a.fi,a.se);
		return num[ret].v;
	}
	int queb(int v) {
		p2 a=splv(root,v);
		int ret=a.se;
		while(num[ret].t[0]!=-1)
			ret=num[ret].t[0];
		root=mer(a.fi,a.se);
		return num[ret].v;
	}
} treap;

inline int read() {
	int f=1,x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
		f=(ch=='-'?-1:f),ch=getchar();
	while(ch>='0'&&ch<='9')
		x=x*10+ch-'0',ch=getchar();
	return f*x;
}

int main() {
	srand(time(NULL));
	n=read();
	while(n--) {
		int opt=read(),x=read();
		if(opt==1)
			treap.ins(x);
		if(opt==2)
			treap.del(x);
		if(opt==3)
			printf("%d\n",treap.quer(x));
		if(opt==4)
			printf("%d\n",treap.quev(x));
		if(opt==5)
			printf("%d\n",treap.quef(x));
		if(opt==6)
			printf("%d\n",treap.queb(x));
	}
}
2024/1/26 22:13
加载中...