求助,fhqtreap
查看原帖
求助,fhqtreap
272314
Autonomier楼主2020/7/9 18:36
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
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*10+ch-'0',ch=getchar();
   return s*w;
}
struct fhq_tree
{
	int l,r;
	int key;
	int val;
	int siz;
}t[maxn];
int cnt,rt;
inline int newnode(int val)
{
	t[++cnt].key=rand();
	t[cnt].val=val;
	t[cnt].siz=1;
	return cnt;
}
inline void update(int now)
{
	t[now].siz=t[t[now].l].siz+t[t[now].r].siz+1;
}
inline void split(int val,int now,int &x,int &y)
{
	if(!now)
		x=y=0;
	else
	{
		if(t[now].val<=val)
		{
			x=now;
			split(val,t[now].r,t[now].r,y);
		}
		else
		{
			y=now;
			split(val,t[now].l,x,t[now].l);
		}
		update(now);
	}
}
inline int merge(int x,int y)
{
	if(!x||!y)
		return x+y;
	if(t[x].key>t[y].key)
	{
		t[x].r=merge(t[x].r,y);
		update(x);
		return x;
	}
	else
	{
		t[y].l=merge(x,t[y].l);
		update(y);
		return y;
	}
}
int x,y,z;
inline void insert(int val)
{
	split(val,rt,x,y);
	rt=merge(merge(x,newnode(val)),y);
}
inline int pre(int val)
{
	split(val,rt,x,y);
	int now=x;
	while(t[now].r)
		now=t[now].r;
	rt=merge(x,y);
	return t[now].val;	
}
inline int nxt(int val)
{
	split(val-1,rt,x,y);
	int now=y;
	while(t[now].l)
		now=t[now].l;
	rt=merge(x,y);
	return t[now].val;
}
int main()
{
	int n;
	n=read();
	int res=0;
	for(int i=1;i<=n;i++)
	{
		int a;
		a=read();
		int trans=min(abs(pre(a)-a),abs(nxt(a)-a));
		insert(a);
		res+=trans;
	}
	printf("%d\n",res);
	return 0;
}
2020/7/9 18:36
加载中...