替罪羊树wa&MLE 51pts求调
查看原帖
替罪羊树wa&MLE 51pts求调
858420
liusuhang123楼主2025/7/29 20:05

替罪羊树wa&MLE 51pts

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
long long n,cnt,rt;
long long ls[N],rs[N],tot,siz[N],val[N],v[N],tmp[N],sum[N];
void pushup(int x){
	siz[x]=siz[ls[x]]+siz[rs[x]]+sum[x];
}
int build(int l,int r){
	if(l>r){
		return 0;
	}
	int mid=l+r>>1;
	int x=tmp[mid];
	val[x]=v[mid];
	sum[x]++;
	ls[x]=build(l,mid-1);
	rs[x]=build(mid+1,r);
	pushup(x);
	return x;
}
void flatten(int x){
	if(!x){
		return;
	}
	flatten(ls[x]);
	while(sum[x]){
		tmp[++cnt]=x;
		v[cnt]=val[x];
		sum[x]--;
	}
	flatten(rs[x]);
	ls[x]=rs[x]=0;
	siz[x]=0;
}
int rebuild(long long x){
	cnt=0;
	flatten(x);
	return build(1,cnt);
}
void insert(long long &root,int x){ 
	if(!root){
		root=++tot;
		sum[tot]++;
		val[tot]=x;
	}
	else if(x==val[root]){
		sum[root]++;
	}
	else if(x<val[root]){
		insert(ls[root],x);
	}
	else if(x>val[root]){
		insert(rs[root],x);
	}
	pushup(root);
	if((double)max(siz[ls[root]],siz[rs[root]])>=(double)siz[root]*0.7){
		root=rebuild(root);
	}
}
void dfs(int k,int x){
	if(rs[k]){
		dfs(rs[k],x);
	}
	else{
		rs[k]=x;
	}
}
void del(long long &root,int x){
	if(x==val[root]){
		sum[root]--;
		if(!ls[root]&&!rs[root]){
			root=0;
		}
		else if(!rs[root]){
			int tt=ls[root];
			ls[root]=0;
			root=tt;
		} 
		else if(!ls[root]){
			int tt=rs[root];
			rs[root]=0;
			root=tt;
		}
		else{
			dfs(ls[root],rs[root]);
			rs[root]=0;
			root=ls[root];
		}
	}
	else if(x<val[root]){
		del(ls[root],x);
	}
	else if(x>val[root]){
		del(rs[root],x);
	}
	pushup(root);
	if((double)max(siz[ls[root]],siz[rs[root]])>=(double)siz[root]*0.7){
		root=rebuild(root);
	}
}
long long check(int root,int x){
	if(!root){
		return 0;
	}
	else if(x==val[root]){
		return siz[ls[root]];
	}
	else if(x<val[root]){
		return check(ls[root],x);
	}
	else if(x>val[root]){
		return siz[ls[root]]+sum[root]+check(rs[root],x);
	}
}
long long rk(int root,int x){
	if(x>siz[ls[root]]&&x<=siz[ls[root]]+sum[root]){
		return val[root];
	}
	else if(x<=siz[ls[root]]&&ls[root]){
		return rk(ls[root],x);
	}
	else if(x>siz[ls[root]]+sum[root]&&rs[root]){
		return rk(rs[root],x-siz[ls[root]]-sum[root]);
	}
	return 0;
}
long long fir(int root,int x,long long k){
	if(x>=val[root]&&rs[root]==0){
		return val[root];
	}
	else if(x<=val[root]&&ls[root]){
		return fir(ls[root],x,k);
	}
	else if(x>val[root]&&rs[root]){
		return fir(rs[root],x,max(val[root],k));
	}
	return k;
}
long long lst(int root,int x,long long k){
	if(x<=val[root]&&ls[root]==0){
		return val[root];
	}
	else if(x<val[root]&&ls[root]){
		long long tt=min(val[root],k);
		return lst(ls[root],x,tt);
	}
	else if(x>=val[root]&&rs[root]){
		return lst(rs[root],x,k);
	}
	return k;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		int opt,x;
		cin>>opt>>x;
		if(opt==1) insert(rt,x);
		else if(opt==2) del(rt,x);
		else if(opt==3) {
			cout<<check(rt,x)+1<<"\n";
		}
		else if(opt==4){
			cout<<rk(rt,x)<<"\n";
		}
		else if(opt==5) {
			cout<<fir(rt,x,0)<<"\n";
		}
		else if(opt==6) {
			cout<<lst(rt,x,1e18)<<"\n";
		}
	}
	return 0;
}

2025/7/29 20:05
加载中...