FHQ_Treap WA 0pts 求调
查看原帖
FHQ_Treap WA 0pts 求调
779970
lunjiahao楼主2024/5/4 10:54

rt,疑似操作 S 写挂了?

#include<bits/stdc++.h>
#define ls(u) t[u].ls
#define rs(u) t[u].rs
using namespace std;
const int N=3e5+5;
int n,mi,delta,root,cnt,ans;
struct FHQ_Treap
{
	int ls,rs;
	int val,pri;
	int siz;
}t[N];
void update(int u)
{
	t[u].siz=t[ls(u)].siz+t[rs(u)].siz+1;
}
int newNode(int x)
{
	int u=++cnt;
	t[u].ls=t[u].rs=0;
	t[u].val=x;
	t[u].pri=rand();
	t[u].siz=1;
	return u;
}
void spilt(int u,int x,int &L,int &R)
{
	if(!u)
	{
		L=R=0;
		return;
	}
	if(t[u].siz<=x)
	{
		L=u;
		spilt(rs(u),x,rs(u),R);
	}
	else
	{
		R=u;
		spilt(ls(u),x,L,ls(u));
	}
	update(u);
}
int merge(int L,int R)
{
	if(!L||!R) return L|R;
	if(t[L].pri>t[R].pri)
	{
		t[L].rs=merge(t[L].rs,R);
		update(L);
		return L;
	}
	else
	{
		t[R].ls=merge(L,t[R].ls);
		update(R);
		return R;
	}
}
int kth(int u,int k)
{
	if(k==t[ls(u)].siz+1) return u;
	if(k<=t[ls(u)].siz) return kth(ls(u),k);
	if(k>t[ls(u)].siz) return kth(rs(u),k-t[ls(u)].siz-1);
}
void dfs(int u)
{
	if(ls(u)) dfs(ls(u));
	printf("%d ",t[u].val);
	if(rs(u)) dfs(rs(u));
}
int main()
{
	srand(time(0));
	scanf("%d%d",&n,&mi);
	while(n--)
	{
		char opt[5];
		int x,L,R,p;
		scanf("%s%d",opt,&x);
		if(opt[0]=='I')
		{
			if(x<mi) continue;
			x-=delta;
			spilt(root,x,L,R);
			root=merge(merge(L,newNode(x)),R);
		}
		if(opt[0]=='A') delta+=x;
		if(opt[0]=='S')
		{
			delta-=x;
			spilt(root,mi-delta-1,L,R);
			root=R;
			ans+=t[L].siz;
		}
		if(opt[0]=='F')
			printf("%d\n",x>t[root].siz?-1:t[kth(root,t[root].siz-x+1)].val+delta);
	}
	printf("%d",ans);
	return 0;
}
2024/5/4 10:54
加载中...