替罪羊树求调,91分
查看原帖
替罪羊树求调,91分
1046923
in_shadow楼主2025/8/2 21:55

吸氧用时1.43s,TLE on #14.
替罪羊树code:

#include<bits/stdc++.h>
//#pragma GCC optimize("1")
//#pragma GCC optimize("3")
#define ll long long
using namespace std;
ll n,opt,x,z,order[100005],tree_stack[100005];
ll cnt,ttop,root,ret,deep,td;
const double alpha=0.75;
struct node
{
	ll ls,rs,val,tot,sz,del;
}e[100005];
inline bool is_balanced(ll u)
{
	if(max(e[e[u].ls].sz,e[e[u].rs].sz)>=(double)e[u].sz*alpha) return false;
	else			return true;
}
inline void push_up(ll u)
{
	e[u].sz=e[e[u].ls].sz+e[e[u].rs].sz+1;
	e[u].tot=e[e[u].ls].tot+e[e[u].rs].tot+1;
}
inline void initnode(ll &u)
{
	e[u].ls=e[u].rs=0;
	e[u].sz=e[u].tot=e[u].del=1;
}
inline void build(ll l,ll r,ll &u)
{
	ll mid=(l+r)>>1;
	u=order[mid];
	if(l==r) //叶子节点 
	{
		initnode(u);
		return ;
	}
	if(l<mid) build(l,mid-1,e[u].ls); //左树 
	if(l==mid) e[u].ls=0; //没有左树 
	build(mid+1,r,e[u].rs); //有左就有右 
	push_up(u);
}
inline void inorder(ll u)//中序遍历 
{
	if(!u) return ;
	inorder(e[u].ls);
	if(e[u].del) order[++cnt]=u;
	else	tree_stack[++ttop]=u;
	inorder(e[u].rs);
}
inline void rebuild(ll &u)
{
	cnt=0;
	inorder(u);    //拍平 
	if(!cnt) u=0;
	else	build(1,cnt,u);
}
inline void insert(ll now,ll &u,ll x,ll &y,ll y_fa)
{
	if(!u)
	{
		u=tree_stack[ttop--];
		e[u].val=x;
		initnode(u);
		return ;
	} 
	e[u].sz++;
	e[u].tot++;
	if(e[u].val>=x) insert(e[u].ls,e[u].ls,x,y,y_fa);
	else insert(e[u].rs,e[u].rs,x,y,y_fa);
	if(!is_balanced(now)) y=now,td=0;
	if(e[now].ls==y||e[now].rs==y) y_fa=now; 
	td++;
	if((now==root&&y!=-1&&deep+1<td)||(e[u].tot*alpha>=e[u].sz)) 
	{ 
		if(y==root) 
		{
			rebuild(y); 	
			root=y; 
		}
		else
		{
			if(e[y_fa].ls==y)
			{
				rebuild(y);
				e[y_fa].ls=y;
			}
			if(e[y_fa].rs==y)
			{
				rebuild(y);
				e[y_fa].rs=y;
			}	
		}
	}
}
inline ll ranks(ll u,ll x)
{
	if(!u) return 0;
	if(e[u].val<x) return e[e[u].ls].sz+e[u].del+ranks(e[u].rs,x);
	else	return ranks(e[u].ls,x);
}
inline ll kth(ll u,ll k)
{
	ret=0;
	while(u)
	{
		if(e[u].del&&e[e[u].ls].sz+1==k) return e[u].val;	
		else if(e[e[u].ls].sz+e[u].del<k)
		{
			k=k-e[e[u].ls].sz-e[u].del;
			u=e[u].rs;	
		}
		else u=e[u].ls;
	}
} 
inline void del_kth(ll &u,ll k)
{
	e[u].sz--;
	if(e[u].del&&e[e[u].ls].sz+1==k) 
	{
		e[u].del=0;
		return ;
	}
	else if(e[e[u].ls].sz+e[u].del<k) del_kth(e[u].rs,k-e[e[u].ls].sz-e[u].del);	
	else	return del_kth(e[u].ls,k);
}
inline void del(ll x)
{
	del_kth(root,ranks(root,x)+1);
	if(e[root].tot*alpha>=e[root].sz) rebuild(root);
}
signed main(){
	for(ll i=100000;i>=1;i--)
		tree_stack[++ttop]=i;
	scanf("%lld",&n);
	while(n--)
	{
		scanf("%lld %lld",&opt,&x);	
		ll rebuild_root=-1;
		if(opt==1) 
		{
			td=0;
			deep=log2(e[root].sz+1);
			insert(root,root,x,rebuild_root,-1);
		}
		if(opt==2) del(x);
		if(opt==3) printf("%lld\n",ranks(root,x)+1);	
		if(opt==4) printf("%lld\n",kth(root,x));
		if(opt==5) printf("%lld\n",kth(root,ranks(root,x)));	
		if(opt==6) printf("%lld\n",kth(root,ranks(root,x+1)+1));	
	}
    return 0;
}

help,求求(尽力了)

2025/8/2 21:55
加载中...