fhq treap求调
查看原帖
fhq treap求调
703115
d909RCA楼主2024/3/1 20:14

此生听取所有的WA声

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct fhq
{
	struct tree
	{
		int ls,rs,key,sz,pro;
	}t[2000009];
	int tot=0,rt=0;
	int addn(int x)
	{
		t[++tot].key=x;
		t[tot].pro=rand();
		t[tot].sz=1;
		return tot;
	}
	void pushup(int x)
	{
		t[x].sz=t[t[x].ls].sz+t[t[x].rs].sz+1;
	}
	void split_num(int pos,int x,int &l,int &r)
	{
		if(!pos)
		{
			l=0;
			r=0;
			return ;
		}
		if(t[pos].key<=x)
		{
			l=pos;
			split_num(t[l].rs,x,t[l].rs,r);
		}
		else
		{
			r=pos;
			split_num(t[r].ls,x,l,t[r].ls);
		}
		pushup(pos);
	}
	void split_rank(int pos,int k,int &p1,int &p2)
	{
		if(!pos) p1=p2=0;
		else
		{
			int ln=t[t[pos].ls].sz;
			if(ln<k)
			{
				p1=pos;
				split_rank(t[pos].rs,k-ln-1,t[p1].rs,p2);
			}
			else
			{
				p2=pos;
				split_rank(t[pos].ls,k,p1,t[p2].ls);
			}
			pushup(pos);
		}
	}
	int merge(int l,int r)
	{
		if(!l||!r) return l|r;
		if(t[l].pro<=t[r].pro)
		{
			t[l].rs=merge(t[l].rs,r);
			pushup(l);
			return l;
		}
		else
		{
			t[r].ls=merge(l,t[r].ls);
			pushup(r);
			return r;
		}
	}
	void insert(int x)
	{
		int l=0,r=0;
		split_num(rt,x-1,l,r);
		rt=merge(merge(l,addn(x)),r);
	}
	void dlt(int x)
	{
		int l,r,p1,p2,tt;
		split_num(rt,x-1,l,r);
		split_num(r,x,p1,p2);
		tt=merge(t[tt].ls,t[tt].rs);
		rt=merge(p1,merge(tt,p2));
	}
	int get_rk(int x)
	{
		int l=0,r=0;
		split_num(rt,x-1,l,r);
		int rk=t[l].sz+1;
		rt=merge(l,r);
		return rk;
	} 
	int get_num(int pos,int k)
	{
		int ln=t[t[pos].ls].sz+1;
		if(ln==k) return t[pos].key;
		if(ln>k) return get_num(t[pos].ls,k);
		else return get_num(t[pos].rs,k-ln);
	}
	int pre(int x)
	{
		int l=0,r=0;
		split_num(rt,x-1,l,r);
		int ans,l2=l;
		while(t[l2].rs)
		{
			l2=t[l2].rs;
		}
		ans=t[l2].key;
		rt=merge(l,r);
		return ans;
	}
	int suc(int x)
	{
		int l=0,r=0;
		split_num(rt,x,l,r);
		int ans,r2=r;
		while(t[r2].ls)
		{
			r2=t[r2].ls;
		}
		ans=t[r2].key;
		rt=merge(l,r);
		return ans;
	}
}treap;
int n;
signed main()
{
	int ans;
	srand(time(0));
	cin>>n;
	cin>>ans;
	treap.insert(ans);
	while(--n)
	{
		int x;
		cin>>x;
		ans+=min(abs(treap.pre(x)-x),abs(treap.suc(x)-x));
		treap.insert(x);
	}
	cout<<ans<<endl;
	return 0;
}
 
2024/3/1 20:14
加载中...