红黑树求调
查看原帖
红黑树求调
989792
lrx___楼主2024/8/22 22:03
#ifdef ONLINE_JUDGE
#define ___coding false
#else
#define ___coding true
#endif
#include<bits/stdc++.h>
#define UP(i,a,b) for(i=a;i<=(b);++i)
#define DN(i,a,b) for(i=a;i>=(b);--i)
#define up(i,a,b) for(i=a;i<(b);++i)
#define dn(i,a,b) for(i=a;i>(b);--i)
const int BUF_SIZE(1<<14);
typedef long long ll;typedef unsigned long long ull;typedef __int128 pll;bool ___f;char ___c,___a[45],*___p,___ibuf[BUF_SIZE+1],*___ib(___ibuf),*___ie(___ibuf),___obuf[BUF_SIZE+1],*___ob(___obuf),*___oe(___obuf+BUF_SIZE);inline char& gtch(){return ___ib==___ie&&(___ie=(___ib=___ibuf)+fread(___ibuf,1,BUF_SIZE,stdin),___ib==___ie)?*___ib=-1:*___ib++;}void ___flush(){fwrite(___obuf,1,___ob-___obuf,stdout);___ob=___obuf;}inline void ptch(char c){if(___ob==___oe)___flush();*___ob=c;++___ob;}void rd(bool &r){r=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch())r|=(___c!='0');}void rd(char &c){for(c=gtch();c==' '||c=='\r'||c=='\n';c=gtch());}inline void rd(int &r){r=___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch())___f=(___c=='-');for(;___c>='0'&&___c<='9';___c=gtch())r=(r<<3)+(r<<1)+(___c^'0');if(___f)r=~(r-1);}inline void rd(ll &r){r=___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch())___f=(___c=='-');for(;___c>='0'&&___c<='9';___c=gtch())r=(r<<3)+(r<<1)+(___c^'0');if(___f)r=~(r-1);}void rd(ull &r){r=0;for(___c=gtch();___c<'0'||___c>'9';___c=gtch());for(;___c>='0'&&___c<='9';___c=gtch())r=(r<<3)+(r<<1)+(___c^'0');}void rd(char *s){for(*s=gtch();*s==' '||*s=='\r'||*s=='\n';*s=gtch());for(;~*s&&*s!=' '&&*s!='\r'&&*s!='\n';++s,*s=gtch());*s=0;}void rd(pll &r){r=___f=false;for(___c=gtch();___c<'0'||___c>'9';___c=gtch())___f=(___c=='-');for(;___c>='0'&&___c<='9';___c=gtch())r=(r<<3)+(r<<1)+(___c^'0');if(___f)r=~(r-1);}void wt(char c){ptch(c);}inline void wt(int r){if(r==0)return ptch('0');if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){*++___p=char(r%10)^'0';r/=10;}while(___p!=___a)ptch(*___p--);}inline void wt(ll r){if(r==0)return ptch('0');if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){*++___p=char(r%10)^'0';r/=10;}while(___p!=___a)ptch(*___p--);}void wt(ull r){if(r==0)return ptch('0');___p=___a;while(r!=0){*++___p=char(r%10)^'0';r/=10;}while(___p!=___a)ptch(*___p--);}void wt(char* s){for(;*s;ptch(*s++));}inline void wt(const char* s){for(;*s;ptch(*s++));}void wt(pll r){if(r==0)return ptch('0');if(r<0){ptch('-');r=~(r-1);}___p=___a;while(r!=0){*++___p=char(r%10)^'0';r/=10;}while(___p!=___a)ptch(*___p--);}template<typename T,typename... P>inline void rd(T &a,P &...b){rd(a);rd(b...);}template<typename T,typename... P>inline void wt(T a,P ...b){wt(a);wt(b...);}template<typename T>void RD(T* a,int n){while(n--)rd(*a++);}template<typename T>T ___min(T &a,T &b){return a<b?a:b;}template<typename T,typename... P>T ___min(T &a,T &b,P &...c){return ___min(a,b=___min(b,c...));}template<typename T,typename... P>T min(T a,P ...b){return ___min(a,b...);}template<typename T>T ___max(T &a,T &b){return a>b?a:b;}template<typename T,typename... P>T ___max(T &a,T &b,P &...c){return ___max(a,b=___max(b,c...));}template<typename T,typename... P>T max(T a,P ...b){return ___max(a,b...);}
/*

*/
const int N(1e5+5);
int n;
struct node{
	bool red;
	int sz,vl;
	node *ls,*rs,*fa;
};
struct red_black_tree{
	node t[N],*root,*tot;
	node* new_node(bool red,int k){
		node *u=++tot;u->red=red;u->sz=1;u->vl=k;u->ls=u->rs=u->fa=t;
		return u;
	}
	void push_u(node* u){
		u->sz=u->ls->sz+u->rs->sz+1;
	}
	bool ls(node* u){
		return u->fa->ls==u;
	}
	void rotate(node* u){
		node *f(u->fa),*g(f->fa);
		if(ls(u)){
			f->ls=u->rs;
			if(f->ls!=t)f->ls->fa=f;
			u->rs=f;
		}else{
			f->rs=u->ls;
			if(f->rs!=t)f->rs->fa=f;
			u->ls=f;
		}
		if(g!=t){
			ls(f)?g->ls=u:g->rs=u;
		}else root=u;
		f->fa=u;u->fa=g;
		push_u(f);push_u(u);
	}
	void insert(int k){
		node *u(root),*f,*g,*un;
		if(root==t){
			root=new_node(false,k);
			return;
		}
		while(u!=t){
			f=u;++f->sz;
			u=(k<u->vl?u->ls:u->rs);
		}
		// printf("f=%d\n",f->vl);
		u=new_node(true,k);u->fa=f;
		k<f->vl?f->ls=u:f->rs=u;
		// printf("BEFORE UPDATE:\n");
		// travel();
		while(u->fa->red){
			f=u->fa;g=f->fa;un=ls(f)?g->rs:g->ls;
			if(un->red){
				f->red=un->red=false;g->red=true;
				u=g;
			}else{
				if(ls(u)^ls(f)){
					rotate(u);u=f;f=u->fa;
				}
				rotate(f);
				f->red=false;g->red=true;
				break;
			}
		}
		root->red=false;
	}
	void erase(int k){
		node *u(root),*f,*s,*c,*d;
		while(k!=u->vl){
			--u->sz;u=(k<u->vl?u->ls:u->rs);
		}
		if(u->ls!=t&&u->rs!=t){
			--u->sz;s=u->rs;
			while(s->ls!=t){
				--s->sz;s=s->ls;
			}
			u->vl=s->vl;u=s;
		}
		f=u->fa;
		if(u->ls!=t||u->rs!=t){
			s=(u->ls!=t?u->ls:u->rs);
			if(u==root){
				root=s;s->fa=t;
			}else{
				ls(u)?f->ls=s:f->rs=s;
				s->fa=f;s->red=false;
			}
		}else if(u->red){
			ls(u)?f->ls=t:f->rs=t;
		}else if(u==root){
			root=t;
		}else{
			while(u!=root){
				f=u->fa;s=(ls(u)?f->rs:f->ls);c=(ls(u)?s->ls:s->rs);d=(ls(u)?s->rs:s->ls);
				if(s->red){
					rotate(s);s->red=false;f->red=true;
					s=(ls(u)?f->rs:f->ls);c=(ls(u)?s->ls:s->rs);d=(ls(u)?s->rs:s->ls);
				}
				if(!c->red&&!d->red){
					if(f->red){
						f->red=false;s->red=true;
						break;
					}else{
						s->red=true;
						u=f;
					}
				}else{
					if(!d->red){
						rotate(c);c->red=false;s->red=true;
						s=(ls(u)?f->rs:f->ls);c=(ls(u)?s->ls:s->rs);d=(ls(u)?s->rs:s->ls);
					}
					rotate(s);s->red=f->red;f->red=d->red=false;
					break;
				}
			}
			f=u->fa;
			ls(u)?f->ls=t:f->rs=t;
			root->red=false;
		}
	}
	int less(int k){
		int res(0);
		node *u(root);
		while(u!=t){
			if(k<=u->vl)u=u->ls;
			else{
				res+=u->ls->sz+1;
				u=u->rs;
			}
		}
		return res;
	}
	int kth(int k){
		node *u(root);
		while(k!=u->ls->sz+1){
			if(k<u->ls->sz+1)u=u->ls;
			else{
				k-=u->ls->sz+1;
				u=u->rs;
			}
		}
		return u->vl;
	}
	int pre(int k){
		return kth(less(k));
	}
	int suc(int k){
		return kth(less(k+1)+1);
	}
	void clear(){
		root=tot=t;
	}
	void tra(node* u){
		if(u!=t){
			printf("<");
			tra(u->ls);
			printf(">%d,%c<",u->vl,u->red?'R':'B');
			tra(u->rs);
			printf(">");
		}
	}
	void travel(){
		tra(root);printf("\n");
	}
}tree;

void ___main(){
	int i,o,k;
	tree.clear();
	rd(n);
	up(i,0,n){
		if(i==898)tree.travel();
		printf("i=%d\n",i);
		rd(o,k);
		switch(o){
		case 1:tree.insert(k);break;
		case 2:tree.erase(k);break;
		case 3:wt(tree.less(k)+1,'\n');break;
		case 4:wt(tree.kth(k),'\n');break;
		case 5:wt(tree.pre(k),'\n');break;
		case 6:wt(tree.suc(k),'\n');break;
		}
		// tree.travel();
	}
}int main(){if(___coding)freopen("in.txt","r",stdin);___main();___flush();return 0;}

2024/8/22 22:03
加载中...