&pts,splay求调
查看原帖
&pts,splay求调
1087796
yangmeinaixi楼主2024/2/24 16:13
#include<bits/stdc++.h>
using namespace std;
int n,tot,root,ans;
struct dog{int data,num,l,r,ln,rn,fa;}tree[3276800];
#define data(i) tree[i].data
#define num(i) tree[i].num
#define ln(i) tree[i].ln
#define rn(i) tree[i].rn
#define ls(i) tree[i].l
#define rs(i) tree[i].r
#define fa(i) tree[i].fa
#define il inline
il void zag(int x){
	int y=fa(x);
	rs(y)=ls(x);
	if(ls(x))fa(ls(x))=y;
	fa(x)=fa(y);
	if(fa(y)) if(y==ls(fa(y)))ls(fa(y))=x;else rs(fa(y))=x;
	ls(x)=y,fa(y)=x,rn(y)=ln(x),ln(x)=rn(y)+ln(y)+num(y);
}
il void zig(int x){
	int y=fa(x);
	ls(y)=rs(x);
	if(rs(x))fa(rs(x))=y;
	fa(x)=fa(y);
	if(fa(y)) if(y==ls(fa(y)))ls(fa(y))=x;else rs(fa(y))=x;
	rs(x)=y,fa(y)=x,ln(y)=rn(x),rn(x)=rn(y)+ln(y)+num(y);
}
il void splay(int x){
	while(fa(x)){
		if(ls(fa(x))==x)zig(x);
		else zag(x);
	}
	root=x;
}
il int find(int x){
	int p=root;
	while(p){
		if(data(p)==x){splay(p);return 1;}
		else if(data(p)<x)p=ls(p);
		else p=rs(p);
	}
}
il int finddid(int k){
	int p=root;
	if(ln(p)+rn(p)+1<k)return -1;
	while(1){
		if(rn(p)+1==k)return data(p);
		else if(rn(p)>=k)p=rs(n);
		else {k=k-rn(p)-1;p=ls(p);}
	}
}
il void insert(int x){
	int p=root,f;
	while(p)
	{
		f=p;
        if(data(f)==x){num(f)++;splay(f);return ;}
		if(x<data(f)){ln(f)++;p=ls(f);}
		else{rn(f)++;p=rs(f);}
	}
	tot++;
	data(tot)=x;
	fa(tot)=0;ls(tot)=0;rs(tot)=0;ln(tot)=0;rn(tot)=0;num(tot)=1;
	if(root==0){root=tot;return ;}
	fa(tot)=f;
	if(x<=data(f))ls(f)=tot;
	else rs(f)=tot;
	splay(tot);
}
il void dlt(int p)
{
	find(p);
	p=root;
	if(num(root)>1){num(root)--;return;}
	if(!ls(p)&&!rs(p)){root=0;return ;}
	if(!ls(p)){root=rs(p);fa(rs(p))=0;return ;}
	if(!rs(p)){root=ls(p);fa(ls(p))=0;return ;}
	int l=ls(p),r=rs(p);
	p=ls(p);
	fa(l)=0;
	while(rs(p))p=rs(p);
	splay(p);
	rs(p)=r;fa(r)=p;
	rn(p)=ln(r)+rn(r)+1;
}
il int maxinum(int p){
	while(rs(p))p=rs(p);
	return data(p);
}
il int mininum(int p){
	while(ls(p))p=ls(p);
	return data(p);
}
il int pred(int x){
	find(x);
	int p=ls(root);
	while(p)
	{
		if(rs(p)==0)break;
		p=rs(p);
	}
	if(p)return data(p);return -1;
}
il int succ(int x){
	find(x);
	int p=rs(root);
	while(p)
	{
		if(ls(p)==0)break;
		p=ls(p);
	}
	if(p!=0)return data(p);
    return -1;
}
il void dfs(int tr){
	if(data(tr)==0){
		return;
	}
	dfs(ls(tr));
	cout<<data(tr)<<' '<<num(tr)<<endl;
	dfs(rs(tr));
}
main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int op,k;
		cin>>op>>k;
		if(op==1)insert(k);
		else if(op==2)dlt(k);
		else if(op==3){insert(k);cout<<ln(root)<<endl;dlt(k);} 
		else if(op==4)cout<<finddid(k)<<endl;
		else if(op==5){insert(k);cout<<pred(k)<<endl;dlt(k);}
		else {insert(k);cout<<succ(k)<<endl;dlt(k);}
	}
}

2WA1AC11TLE

2024/2/24 16:13
加载中...