悬3关,替罪羊树WA51pts求调
查看原帖
悬3关,替罪羊树WA51pts求调
760433
zcz0263楼主2024/4/25 13:02
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define mkp make_pair
#define pb push_back
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define alpha (0.75)
int tot,root,val[100005],cnt[100005],ls[100005],rs[100005],s1[100005],sre[100005],sde[100005];
vi dot;
inline void pushup(int x){
	s1[x]=s1[ls[x]]+s1[rs[x]]+1;
	sre[x]=sre[ls[x]]+sre[rs[x]]+cnt[x];
	sde[x]=sde[ls[x]]+sde[rs[x]]+!!cnt[x];
}
inline bool mustremake(int x){
	return (cnt[x]&&(alpha*s1[x]<=1.0*max(s1[ls[x]],s1[rs[x]])))||(1.0*sde[x]<=alpha*s1[x]);
}
void flat(int x){
//	cerr<<"flat: "<<x<<"\n";
	if(!x) return;
	flat(ls[x]);
	if(cnt[x]) dot.pb(x);
	flat(rs[x]);
}
int build(int l,int r){
	int mid=(l+r)>>1;
//	cout<<"build: "<<l<<" "<<mid<<" "<<r<<" "<<dot.size()<<endl;
	if(l>=r) return 0;
	ls[dot[mid]]=build(l,mid);
	rs[dot[mid]]=build(mid+1,r);
	pushup(dot[mid]);
	return dot[mid];
}
void remake(int &k){
	dot.clear();
	flat(k);
	k=build(0,dot.size());
}
void insert(int &p,int x){
//	cerr<<"insert: "<<p<<" "<<x<<"\n";
	if(!p){
		p=++tot;
		if(!root) root=1;
		val[p]=x;
		ls[p]=rs[p]=0;
		cnt[p]=s1[p]=sre[p]=sde[p]=1;
	}else{
		if(val[p]==x) cnt[p]++;
		else if(val[p]<x) insert(rs[p],x);
		else insert(ls[p],x);
		pushup(p);
//		cerr<<p<<"\n";
		if(mustremake(p)) remake(p);
	}
}
void erase(int &p,int x){
	if(!p) return;
	if(val[p]==x){
		if(cnt[p]) cnt[p]--;
	}else{
		if(val[p]<x) erase(rs[p],x);
		else erase(ls[p],x);
	}
	pushup(p);
	if(mustremake(p)) remake(p);
}
int upper(int p,int x){
	if(!p) return 1;
	if(val[p]==x&&cnt[p]) return s1[ls[p]]+1+cnt[p];
	if(val[p]>x) return upper(ls[p],x);
	return s1[ls[p]]+cnt[p]+upper(rs[p],x);
}

int lower(int p,int x){
//	cout<<"lowerask: "<<p<<" "<<x<<"\n";
	if(!p) return 0;
	if(val[p]==x&&cnt[p]) return s1[ls[p]];
	if(val[p]<x) return s1[ls[p]]+cnt[p]+lower(rs[p],x);
	return lower(ls[p],x);
}

int askval(int p,int x){
	if(!p) return 0;
	if(s1[ls[p]]<x&&x<=s1[ls[p]]+cnt[p]) return val[p];
	if(s1[ls[p]]+cnt[p]<x) return askval(rs[p],x-s1[ls[p]]-cnt[p]);
	return askval(ls[p],x);
}

int n,q,op,x;
main(){
	ios::sync_with_stdio(0),cin.tie(nullptr);
	
	cin>>q;
	rep(i,1,q){
		cin>>op>>x;
		switch(op){
			case 1:{
				insert(root,x);
				break;
			}
			case 2:{
				erase(root,x);
				break;
			}
			case 3:{
				cout<<lower(root,x)+1<<"\n";
				break;
			}
			case 4:{
				cout<<askval(root,x)<<"\n";
				break;
			}
			case 5:{
				cout<<askval(root,lower(root,x))<<"\n";
				break;
			}
			case 6:{
				cout<<askval(root,upper(root,x))<<"\n";
				break;
			}
		}
	}
}

2024/4/25 13:02
加载中...