萌新求助替罪羊树TLE
查看原帖
萌新求助替罪羊树TLE
236416
_stOrz_楼主2021/6/18 18:44
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const double alpha=0.75;
struct node{
	int l,r,val;
	int size,fact;
	bool vis;
}tzy[maxn];
int cnt,root;
vector<int>q;
int inline read()
{
	char ch=getchar();
	int s=0,f=1;
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
		s=s*10+ch-48,ch=getchar();
	return s*f;	
}
void newnode(int &now,int val)
{
	cnt++;
	now=cnt;
	tzy[now].val=val;
	tzy[now].fact=tzy[now].size=1;
	tzy[now].vis=true;
}//
bool imbalence(int now)
{
	if(tzy[now].vis&&(double)max(tzy[tzy[now].l].size,tzy[tzy[now].r].size)>(double)tzy[now].size*alpha||(double)(tzy[now].size-tzy[now].fact)>(double)(tzy[now].size*0.3)) return false;
	return true;
}//
void ldr(int now)
{
	if(!now)return;
	ldr(tzy[now].l);
	if(tzy[now].vis)
		q.push_back(now);
	ldr(tzy[now].r);	
}//
void lift(int l,int r,int &now)
{
	if(l==r)
	{
		now=q[l];
		tzy[now].l=tzy[now].r=0;
		tzy[now].size=tzy[now].fact=1;
		return;
	}
	int mid=(l+r)>>1;
	while(mid&&l<mid&&tzy[q[mid]].val==tzy[q[mid-1]].val)
		mid--;
	now=q[mid];
	if(l<mid) lift(l,mid-1,tzy[now].l);
	else tzy[now].l=0;
	lift(mid+1,r,tzy[now].r);
	tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
	tzy[now].fact=tzy[tzy[now].l].fact+tzy[tzy[now].r].fact+1; 
}//
void update(int now,int end)
{
	if(!now)return;
	if(tzy[end].val<tzy[now].val) 
		update(tzy[now].l,end);
	else update(tzy[now].r,end);
	tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
}//
void rebuild(int &now)
{
	q.clear();
	ldr(now);
	if(q.empty())
	{
		now=0;
		return;
	}
	lift(0,q.size()-1,now);
}
void check(int &now,int end)
{
	if(now==end)return;
	if(imbalence(now))
	{
		rebuild(now);
		update(root,now);
		return ;
	}
	if(tzy[end].val<tzy[now].val) check(tzy[now].l,end);
	else check(tzy[now].r,end);
}//
void ins(int &now,int val)
{
	if(!now)
	{
		newnode(now,val);
		check(root,now);
		return;
	}
	tzy[now].size++;
	tzy[now].fact++;
	if(val<tzy[now].val)
		ins(tzy[now].l,val);
	else
		ins(tzy[now].r,val);
	return;	
}//
void del(int now,int val)
{
	if(tzy[now].vis&&tzy[now].val==val)
	{
		tzy[now].fact--;
		tzy[now].vis=false;
		check(root,now);
		return;
	}
	tzy[now].fact--;
	if(val<tzy[now].val) 
		del(tzy[now].l,val);
	else del(tzy[now].r,val);
	return ;
}//
int getrank(int val)
{
	int now=root,rank=1;
	while(now)
	{
		if(val<=tzy[now].val)
			now=tzy[now].l;
		else 
		{
			rank+=tzy[now].vis+tzy[tzy[now].l].fact;
			now=tzy[now].r;	
		}	
	}
	return rank;
}
int gettnum(int rank)
{
	int now=root;
	while(now)
	{
		if(tzy[now].vis&&tzy[tzy[now].l].fact+tzy[now].vis==rank) 
			break;
		else if(tzy[tzy[now].l].fact>=rank) 
			now=tzy[now].l;
		else {
			rank-=tzy[tzy[now].l].fact+tzy[now].vis;
			now=tzy[now].r;
		}
	}
	return tzy[now].val;
}
int main()
{
	int n;
	n=read();
	for(int i=1;i<=n;i++)
	{
		int opt,val;
		opt=read(),val=read();
		switch(opt){
			case 1:{
				ins(root,val);
				break;
			}
			case 2:{
				del(root,val);
				break;
			}
			case 3:{
				printf("%d\n",getrank(val));
				break;
			}
			case 4:{
				printf("%d\n",gettnum(val));
				break;
			}
			case 5:{
				printf("%d\n",gettnum(getrank(val)-1));
				break;
			}
			case 6:{
				printf("%d\n",gettnum(getrank(val+1)));
				break;
			}
		}	
		
	}	
	
}
2021/6/18 18:44
加载中...