0pts 玄关 fhq 求调 样例过了
查看原帖
0pts 玄关 fhq 求调 样例过了
648756
Shadow_Lord楼主2023/7/15 18:20
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
inline int read()
{
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s*w;
}
int n,cnt,now,ans;
int v[N],sz[N],ch[N][2],root,dat[N];
int New(int val)
{
	sz[++cnt]=1;
	v[cnt]=val;
	dat[cnt]=rand();
	return cnt;
}
void pushup(int x)
{
	sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
}
int merge(int x,int y)
{
	if(!x||!y)return x|y;
	if(dat[x]<dat[y])
	{
		ch[x][1]=merge(ch[x][1],y);
		pushup(x);
		return x;
	}
	else
	{
		ch[y][0]=merge(x,ch[y][0]);
		pushup(y);
		return y;
	}
}
void split(int rt,int val,int &x,int &y)
{
	if(!rt)
	{
		x=y=0;
	}
	else
	{
		if(v[rt]<=val)
		{
			x=rt;
			split(ch[rt][1],val,ch[rt][1],y);
		}
		else
		{
			y=rt;
			split(ch[rt][0],val,x,ch[rt][0]);
		}
		pushup(rt);
	}
}
void del(int v)
{
	int x,y,z;
	split(root,v,x,y);
	split(x,v-1,x,z);
	root=merge(x,y);
}
void ins(int val)
{
	int x,y,z;
	split(root,val,x,y);
	split(x,val-1,x,z);
	root=merge(merge(x,New(val)),y);
}
int prem(int val)
{
	int x=0,y=0,z=0,res=0x3f3f3f3f;
	split(root,val-1,x,y);
	z=x;
	while(z)
	{
		res=v[z];
		z=ch[z][1];
	}
	root=merge(x,y);
	return res;
}
int netm(int val)
{
	int x=0,y=0,z=0,res=0x3f3f3f3f;
	split(root,val,x,y);
	z=y;
	while(z)
	{
		res=v[z];
		z=ch[z][0];
	}
	root=merge(x,y);
	return res;
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		int opt=read(),b=read();
		if(opt==0)
		{
			if(now<0)
			{
				int v1=prem(b),v2=netm(b);
				// cout<<v1<<" "<<v2<<" "<<b<<"\n";
				// int v1=0,v2=0;
				if(b-v1==v2-b)
				{
					ans+=abs(b-v1);
					if(v1!=0x3f3f3f3f)del(v1);
				}
				else
				{
					if(abs(b-v1)>abs(v2-b))
					{
						ans+=abs(v2-b);if(v2!=0x3f3f3f3f)del(v2);
					}
					else 
					{
						ans+=abs(v1-b);if(v1!=0x3f3f3f3f)del(v1);
					}
				}
			}
			else
			{
				ins(b);
			}
		}
		else
		{
			if(now>0)
			{
				int v1=prem(b),v2=netm(b);
				// cout<<v1<<" "<<v2<<" "<<b<<"\n";
				// int v1=0,v2=0;
				if(v1-b==v2-b)
				{
					ans+=abs(b-v1);if(v1!=0x3f3f3f3f)del(v1);
				}
				else
				{
					if(abs(b-v1)>abs(v2-b))
					{
						ans+=abs(v2-b);if(v2!=0x3f3f3f3f)del(v2);
					}
					else
					{
						ans+=abs(b-v1);if(v1!=0x3f3f3f3f)del(v1);
					}
				}
			}
			else ins(b);
		}
		if(opt==0)
		{
			now++;
		}
		else now--;
	}
	cout<<ans;
	return 0;
}
2023/7/15 18:20
加载中...