求调!替罪羊树TLE
查看原帖
求调!替罪羊树TLE
1127126
yueyan_WZF楼主2024/7/29 16:32

只有63分

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
const double alf=0.81;
int c[N][2];
int siz[N];//不算被删
int val[N];//值
int esiz[N];//算上被删
int s[N];//k的个数,为0表示不存在(被删
vector<int> v;
int n;
stack<int> sta;
int cnt;
int read()
{
	char c;
	int w=1;
	while((c=getchar())>'9'||c<'0')if(c=='-')w=-1;
	int ans=c-'0';
	while((c=getchar())>='0'&&c<='9')ans=(ans<<1)+(ans<<3)+c-'0';
	return ans*w;
}
void updata(int k){
	siz[k]=siz[c[k][0]]+siz[c[k][1]]+s[k];
	esiz[k]=esiz[c[k][0]]+esiz[c[k][1]]+1+max(s[k],1);
}
int laji(int x){
	int k=0;
	if(!sta.empty()){
		k=sta.top();
		c[k][0]=c[k][1]=0;
		siz[k]=s[k]=val[k]=0;
		sta.pop();
	}
	else k=++cnt;
	siz[k]=s[k]=esiz[k]=1;
	val[k]=x;
	return k;
}
void rbuild(int l,int r,int &k){//重构
	if(l>r) return ;
	int mid=l+r>>1;
	k=v[mid];
	c[k][0]=0;
	c[k][1]=0;
	if(l!=r){
		rbuild(l,mid-1,c[k][0]);
		rbuild(mid+1,r,c[k][1]);
	}
	updata(k);
}
/*void rbuild(int &k,int l,int r)
{
	if(l>r)return ;
	int mid=l+r>>1;
	k=v[mid];
	c[k][0]=0;
	c[k][1]=0;
	if(l!=r)
	{
		rbuild(c[k][0],l,mid-1);
		rbuild(c[k][1],mid+1,r);
	}
	updata(k);
}*/
void dfs(int k){
	//puts("2");
	if(c[k][0]) dfs(c[k][0]);
	if(s[k]) v.push_back(k);
	else sta.push(k);
	if(c[k][1]) dfs(c[k][1]);
//	return ;
}
void build(int &k){
	v.clear();
	v.push_back(0);
	dfs(k);
	k=0;
	int s=v.size()-1;
	rbuild(1,s,k);
}
/*void build(int &k)
{
	v.clear();
	v.push_back(0);
	
	dfs(k);
	k=0;
	int s=v.size()-1;
	rbuild(k,1,s);
}*/
bool check(int k){
	if(s[k]){
		if(esiz[c[k][0]]>=esiz[k]*alf||esiz[c[k][1]]>=esiz[k]*alf||siz[k]<=esiz[k]*alf){
			return 1;
		}
		return 0;
	}
	return 0;
}
void insert(int &k,int v){

	if(!k){
		k=laji(v);
		 return ;	
	}
	//puts("1");
	if(v==val[k]){
		s[k]++;
		updata(k);
		return ;
	}
	if(v<val[k]){
		insert(c[k][0],v);
	}
	else{
		insert(c[k][1],v);
	}
	updata(k);
	if(check(k)) build(k);
	
}
void erase(int &k,int v){
	if(v==val[k]){
		s[k]--;
		updata(k);
		return ;
	}
	if(v<val[k]){
		erase(c[k][0],v);
	}
	else{
		erase(c[k][1],v);
	}
	updata(k);
	if(check(k)) build(k);
}
int find(int k,int x){
//	cout<<val[k]<<endl;
	if(!k) return 0;
	if(val[k]==x) return siz[c[k][0]];
	if(x<val[k]) return find(c[k][0],x);
	else return find(c[k][1],x)+siz[c[k][0]]+s[k];
}
int th(int k,int x){
	//cout<<siz[c[k][0]]<<endl;
	//return 0;
	if(x<=siz[c[k][0]]) return th(c[k][0],x);
	x-=siz[c[k][0]];
	if(x<=s[k]) return val[k];
	x-=s[k];
	return th(c[k][1],x);
}
/*int th(int k,int x)
{
	//	cout<<siz[c[k][0]]<<endl;
	if(x<=siz[c[k][0]])return th(c[k][0],x);
	x-=siz[c[k][0]];
	if(x<=s[k])return val[k];
	x-=s[k];
	return th(c[k][1],x);
}*/
signed main(){
	n=read();
	int r=0;
	while(n--){
		int opt;
		opt=read();
		if(opt==1){
			int x;
			x=read();
			insert(r,x);
		}
		if(opt==2){
			int x;
			x=read();
			erase(r,x);
		}
		if(opt==3){
			int x;
			x=read();
			printf("%d\n",find(r,x)+1);
		}
		if(opt==4){
			int x;
			x=read();
			printf("%d\n",th(r,x));
		}
		if(opt==5){
			int x;
			x=read();
			printf("%d\n",th(r,find(r,x)));
		}
		if(opt==6){
			int x;
			x=read();
		//	cout<<find(r,x+1)<<endl;
			printf("%d\n",th(r,find(r,x+1)+1));
		}
	}
	return 0;
}
2024/7/29 16:32
加载中...