FHQTreap 玄关 只过 hack
查看原帖
FHQTreap 玄关 只过 hack
1198462
dvsfanjo楼主2024/10/5 19:22
#include <bits/stdc++.h> 
using namespace std;
using ll = long long;
const int N = 2e6 + 5;
ll n, sum, a, idx, root;
ll l[N], r[N], sz[N], val[N], key[N];
ll New(ll v)
{
	idx++;
	sz[idx] = 1;
	val[idx] = v;
	key[idx] = rand();
	return idx;
}
void Update(ll u)
{
	sz[u] = sz[l[u]] + sz[r[u]] + 1;
	return;
}
void Split(ll u, ll v, ll &x, ll &y)
{
	if (!u)
	{
		x = y = 0;
		return;
	}
	if (val[u] <= v)
	{
		x = u;
		Split(r[u], v, r[u], y);
	}
	else
	{
		y = u;
		Split(l[u], v, x, l[u]);
	}
	Update(u);
	return;
}
ll Merge(ll x, ll y)
{
	if (!x || !y)
		return x | y;
	if (key[x] < key[y])
	{
		r[x] = Merge(r[x], y);
		Update(x);
		return x;
	}
	else
	{
		l[y] = Merge(x, l[y]);
		Update(y);
		return y;
	}
}
void Insert(ll v)
{
	ll x, y, z;
	z = New(v);
	Split(root, v, x, y);
	root = Merge(Merge(x, z), y);
	return;
}
ll K_th(ll u, ll k)
{
	if (!u)
		return 1;
	if (sz[l[u]] + 1 == k)
		return u;
	if (k <= sz[l[u]])
		return K_th(l[u], k);
	return K_th(r[u], k - sz[l[u]] - 1);
}
ll Pre(ll v)
{
	ll x, y, ans;
	Split(root, v - 1, x, y);
	ans = val[K_th(x, sz[x])];
	root = Merge(x, y);
	return ans;
}
ll Suc(ll v)
{
	ll x, y, ans;
	Split(root, v, x, y);
	ans = val[K_th(y, 1)];
	root = Merge(x, y);
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a;
		if (i == 1) {
			sum = a;
		} else {
			sum += min( abs(a - Pre(a)), 
				    abs(a - Suc(a)));
		}
		Insert(a);
	}
	cout << sum << '\n';
	return 0;
}
2024/10/5 19:22
加载中...