萌新求助替罪羊树
查看原帖
萌新求助替罪羊树
236416
_stOrz_楼主2021/6/12 00:05
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const double alpha=0.7;
struct node{
	int l,r,val;
	int size,fact;
	bool vis;
}tzy[maxn];
int cnt,root;
vector<int>q;
void newnode(int &now,int val)
{
	now=++cnt;
	tzy[now].val=val;
	tzy[now].fact=tzy[now].size=1;
	tzy[now].vis=true;
}
bool imbalence(int now)
{
	if(max(tzy[tzy[now].l].size,tzy[tzy[now].r].size)>tzy[now].size*alpha||tzy[now].size-tzy[now].fact>tzy[now].size*0.3) return false;
	else 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(tzy[now].val>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;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int opt,val;
		scanf("%d%d",&opt,&val);
		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/12 00:05
加载中...