• 板块学术版
  • 楼主zhouwenbo1234
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/2/7 08:04
  • 上次更新2025/2/7 11:20:52
查看原帖
1331638
zhouwenbo1234楼主2025/2/7 08:04

P1486

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e7+5,INF=1e11+5;

int n,minn,root,idx,ans;
struct node{
	int s[2],w,f;
	int size,cnt;
	void init(int _w,int _f)
	{
		w=_w;
		f=_f;
		size=1;
		cnt=1;
	}
}tree[N];

int read()
{
	int x=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
			f=-1;
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

void push_up(int x)
{
	tree[x].size=tree[tree[x].s[0]].size+tree[tree[x].s[1]].size+tree[x].cnt;
}

void rotate(int x)
{
	int y=tree[x].f;
	int z=tree[y].f;
	int k=tree[y].s[1]==x;
	tree[z].s[tree[z].s[1]==y]=x;
	tree[x].f=z;
	tree[y].s[k]=tree[x].s[k^1];
	tree[tree[x].s[k^1]].f=y;
	tree[x].s[k^1]=y;
	tree[y].f=x;
	push_up(y);
	push_up(x);
}

void splay(int x,int k)
{
	while (tree[x].f!=k)
	{
		int y=tree[x].f;
		int z=tree[y].f;
		if (z!=k)
		{
			if ((tree[y].s[1]==x)^(tree[z].s[1]==y))
				rotate(x);
			else
				rotate(y);
		}
		rotate(x);
	}
	if (!k)
		root=x;
}

void insert(int x)
{
	if (x<minn)
		return ;
	int u=root;
	int f=0;
	while (u&&x!=tree[u].w)
	{
		f=u;
		u=tree[u].s[x>tree[u].w];
	}
	if (u)
		tree[u].cnt++;
	else
	{
		u=++idx;
		if (f)
			tree[f].s[x>tree[f].w]=u;
		tree[u].init(x,f);
	}
	splay(u,0);
}

void find(int x)
{
	int u=root;
	if (!u)
		return ;
	while(tree[u].s[x>tree[u].w]&&x!=tree[u].w)
		u=tree[u].s[x>tree[u].w];
	splay(u,0);
}

int get_next(int x,int f)
{
	find(x);
	int u=root;
	if (tree[u].w>x&&f)
		return u;
	if (tree[u].w<x&&!f)
		return u;
	u=tree[u].s[f];
	while(tree[u].s[f^1])
		u=tree[u].s[f^1];
	return u;
}

int get_w(int k)
{
	int u=root;
	if (tree[u].size<k)
		return -1;
	while(1)
	{
		if (k>tree[tree[u].s[1]].size+tree[u].cnt)
		{
			k-=tree[tree[u].s[1]].size+tree[u].cnt;
			u=tree[u].s[0];
		}
		else
		{
			if (tree[tree[u].s[1]].size>=k&&tree[u].s[1])
				u=tree[u].s[1];
			else
			{
				splay(u,0);
				return tree[u].w;
			}	
		}
	}
}
char opt;
int k;

signed main()
{
	n=read(),minn=read();
	insert(INF);
	for (int qwq=1;qwq<=n;qwq++)
	{
		opt=getchar();
		k=read();
		if (opt=='I')
			insert(k);
		else if (opt=='A')
		{
			for (int i=1;i<=idx;i++)
				tree[i].w+=k;
		}
		else if (opt=='S')
		{
			for (int i=1;i<=idx;i++)
				tree[i].w-=k;
			int ovo=get_next(minn-1,1);
			splay(ovo,0);
			ans+=tree[tree[root].s[0]].size;
			tree[root].s[0]=0;
			push_up(root);
		}
		else if (opt=='F')
			cout <<get_w(k+1)<<endl;
	}
	cout <<ans<<endl;
	return 0;
}

样例和下的第一个测试点能过,但显示读到0,求调

2025/2/7 08:04
加载中...