P1486 Splay做法WA30pts求调
  • 板块学术版
  • 楼主OneLeft
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/30 21:59
  • 上次更新2024/7/31 07:54:48
查看原帖
P1486 Splay做法WA30pts求调
574215
OneLeft楼主2024/7/30 21:59

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5,INF=(int)4e18+5,inf=1e9+5;
struct data1
{
	int val,siz,cnt;
	data1 *ls,*rs,*fa;
	data1(){val=siz=cnt=0;}
	data1(int a,int b,int c,data1 *d,data1 *e,data1 *f){val=a,siz=b,cnt=c,ls=d,rs=e,fa=f;}
}*null;
class Splay_tree
{
	private:
		int tot;
		data1 node[N*2],*root;
		data1 *new_node(int val)
		{
			node[++tot]=data1(val,1,1,null,null,null);
			return node+tot;
		}
		void push_up(data1 *u)
		{
			u->siz=u->cnt;
			if(u->ls!=null)u->siz+=u->ls->siz;
			if(u->rs!=null)u->siz+=u->rs->siz;
		}
		void zig(data1 *u)
		{
			data1 *fa=u->fa,*fafa=fa->fa;
			fa->ls=u->rs;
			if(u->rs!=null)u->rs->fa=fa;
			push_up(fa);
			u->rs=fa,fa->fa=u;
			u->fa=fafa;
			push_up(u);
			if(fafa!=null)
			{
				if(fafa->ls==fa)fafa->ls=u;
				else fafa->rs=u;
			}
		}
		void zag(data1 *u)
		{
			data1 *fa=u->fa,*fafa=fa->fa;
			fa->rs=u->ls;
			if(u->ls!=null)u->ls->fa=fa;
			push_up(fa);
			u->ls=fa,fa->fa=u;
			u->fa=fafa;
			push_up(u);
			if(fafa!=null)
			{
				if(fafa->ls==fa)fafa->ls=u;
				else fafa->rs=u;
			}
		}
		void splay(data1 *u,data1 *v)
		{
			while(u->fa!=v)
			{
				data1 *fa=u->fa,*fafa=fa->fa;
				if(fafa==v)
				{
					if(u==fa->ls)zig(u);
					else zag(u);
				}
				else
				{
					bool f1=(u==fa->ls),f2=(fa==fafa->ls);
					if(f1&&f2)zig(u),zig(u);
					if(f1&&!f2)zig(u),zag(u);
					if(!f1&&f2)zag(u),zig(u);
					if(!f1&&!f2)zag(u),zag(u);
				}
			}
			if(u->fa==null)root=u;
		}
		data1 *pre(data1 *u,int val,data1 *res)
		{
			if(u==null)return res;
			if(u->val<val)return pre(u->rs,val,u);
			return pre(u->ls,val,res);
		}
		data1 *nxt(data1 *u,int val,data1 *res)
		{
			if(u==null)return res;
			if(u->val>val)return nxt(u->ls,val,u);
			return nxt(u->rs,val,res);
		}
		void output(data1 *u)
		{
			if(u->ls!=null)output(u->ls);
			cout<<u->val<<' ';
			if(u->rs!=null)output(u->rs);
		}
		void updata(data1 *u,int val)
		{
			u->val+=val;
			if(u->ls!=null)updata(u->ls,val);
			if(u->rs!=null)updata(u->rs,val);
		}
	public:
		void init()
		{
			null=node+(tot=0);
			data1 *u=new_node(INF);
			root=new_node(-INF);
			root->rs=u,u->fa=root;
			root->siz=2,root->fa=null;
		}
		data1 *insert(int val)
		{
			data1 *u=pre(root,val,null);
			splay(u,null);
			data1 *v=nxt(root,val,null);
			splay(v,u);
			if(v->ls!=null)v->ls->cnt++,v->ls->siz++;
			else v->ls=new_node(val),v->ls->fa=v;
			push_up(v),push_up(u);
			return v->ls;
		}
		int remove(int val)
		{
			data1 *u=nxt(root,val-1,null);
			splay(u,null);
			int res=u->ls->siz-1;
			u->ls=node+2,u->ls->fa=u; 
			push_up(u);
			return res;
		}
		data1 *find(data1 *u,int k)
		{
			int rsiz=0,cnt=u->cnt;
			if(u->rs!=null)rsiz=u->rs->siz;
			if(k<=rsiz)return find(u->rs,k);
			if(k<=rsiz+cnt)return u;
			return find(u->ls,k-rsiz-cnt);
		}
		int get_find(int k){return find(root,k)->val;}
		void updata(int val){updata(root,val);}
		int get_siz(){return root->siz;}
}tree;
char op;
int n,minn,k;
int ans;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	tree.init();
    cin>>n>>minn;
    for(int i=1;i<=n;i++)
    {
        cin>>op>>k;
        if(op=='I')data1 *tmp=tree.insert(k);
        if(op=='A')tree.updata(k);
        if(op=='S')tree.updata(-k);
        if(op=='F')
        {
        	int siz=tree.get_siz();
        	if(k>=siz-1)cout<<"-1\n";
        	else cout<<tree.get_find(k+1)<<'\n';
		}
		ans+=tree.remove(minn);
    }
    cout<<ans;
	return 0;
}
2024/7/30 21:59
加载中...