灵异事件
查看原帖
灵异事件
749539
__yun__楼主2024/2/23 09:39

这是一份AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
	int fa,son[2],val,num,sz;
	void make(int _val,int _fa=0){
		fa=_fa;val=_val;num++;son[0]=son[1]=0;
	}
	void clear(){
		fa=son[0]=son[1]=val=num=sz=0;
		return ;
	}
}tr[N];
int rt,idx;
void maintain(int u){
	tr[u].sz=tr[tr[u].son[0]].sz+tr[tr[u].son[1]].sz+tr[u].num;
	return ;
}
int get(int u){
	return u==tr[tr[u].fa].son[1];
}
void rotate(int u){
	int v=tr[u].fa,w=tr[v].fa,chk=get(u);
	tr[v].son[chk]=tr[u].son[chk^1];
	if(tr[u].son[chk^1]){
		tr[tr[u].son[chk^1]].fa=v;
	}
	tr[u].son[chk^1]=v;
	tr[u].fa=w;
	tr[v].fa=u;
	if(w){
		tr[w].son[v==tr[w].son[1]]=u;
	}
	maintain(u);
	maintain(v);
	return ;
}
void splay(int u){
	int v=tr[u].fa;
	while(v){
		if(tr[v].fa){
			if(get(u)==get(v)){
				rotate(v);
			}
			else{
				rotate(u);
			}
		}
		rotate(u);
		v=tr[u].fa;
	}
	rt=u;
	return ;
}
int pre(){
	int u=tr[rt].son[0];
	if(!u){
		return u;
	}
	while(tr[u].son[1]){
		u=tr[u].son[1];
	}
	splay(u);
	return u;
}
int nxt(){
	int u=tr[rt].son[1];
	if(!u){
		return u;
	}
	while(tr[u].son[0]){
		u=tr[u].son[0];
	}
	splay(u);
	return u;
}
int getrank(int val){
	int res=0,u=rt;
	while(u){
		if(val<tr[u].val){
			u=tr[u].son[0];
		}
		else{
			res+=tr[tr[u].son[0]].sz;
			if(val==tr[u].val){
				splay(u);
				return res+1;
			}
			res+=tr[u].num;
			u=tr[u].son[1];
		}
	}
	return res+1;
}
int getkth(int k){
	int u=rt;
	while(1){
		if(tr[u].son[0]!=0&&k<=tr[tr[u].son[0]].sz){
			u=tr[u].son[0];
		}
		else{
			k-=tr[u].num+tr[tr[u].son[0]].sz;
			if(k<=0){
				splay(u);
				return tr[u].val;
			}
			u=tr[u].son[1];
		}
	} 
}
void insert(int val){
	if(!rt){
		rt=++idx;
		tr[rt].make(val);
		maintain(rt);
		return ;
	}
	int u=rt,p=0;
	while(1){
		if(tr[u].val==val){
			tr[u].num++;
			maintain(u);
			maintain(p);
			splay(u);
			break;
		}
		p=u;
		u=tr[u].son[tr[u].val<val];
		if(!u){
			tr[++idx].make(val,p);
			tr[p].son[tr[p].val<val]=idx;
			maintain(idx);
			maintain(idx);
			splay(idx);
			break;
		}
	}
}
void delet(int val){
	getrank(val);
	if(tr[rt].num>1){
		tr[rt].num--;
		maintain(rt);
		return ;
	}
	if(!tr[rt].son[0]&&!tr[rt].son[1]){
		tr[rt].clear();
		rt=0;
		return ;
	}
	if(!tr[rt].son[0]){
		int u=rt;
		rt=tr[rt].son[1];
		tr[rt].fa=0;
		tr[u].clear();
		return ;
	}
	if(!tr[rt].son[1]){
		int u=rt;
		rt=tr[rt].son[0];
		tr[rt].fa=0;
		tr[u].clear();
		return ;
	}
	int u=rt;
	int p=pre();
	tr[tr[u].son[1]].fa=p;
	tr[p].son[1]=tr[u].son[1];
	tr[u].clear();
	maintain(rt);
	return ;
}
int getpre(int val){
	insert(val);
	int res=tr[pre()].val;
	delet(val);
	return res;
}
int getnxt(int val){
	insert(val);
	int res=tr[nxt()].val;
	delet(val);
	return res;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		int op,x;
		cin>>op>>x;
		switch(op){
			case 1:
				insert(x);
				break;
			case 2:
				delet(x);
				break;
			case 3:
				cout<<getrank(x)<<endl;
				break;
			case 4:
				cout<<getkth(x)<<endl;
				break;
			case 5:
				cout<<getpre(x)<<endl;
				break;
			case 6:
				cout<<getnxt(x)<<endl;
				break;
		}
	}
	return 0;
}

将下面代码中第98行中

tr[u].son[0]!=0

改为

!tr[u].son[0]

就会WA

求原因

2024/2/23 09:39
加载中...