FHQ-Treap50pts求调
查看原帖
FHQ-Treap50pts求调
257173
rish楼主2025/6/29 02:05
#include <bits/stdc++.h>
using namespace std;
#define For(i, a, b) for(int i=(a);i<=(b);i++)
#define Ror(i, a, b) for(int i=(a);i>=(b);i--)
const int N = 8e4+10;
int rt, n, cnt, ans, mod = 1000000;
int d[3];
struct Node{
	int ls, rs, v, num, pri;
}f[N];
void newnode(int x)
{
	f[++cnt].ls = f[cnt].rs = 0;
	f[cnt].num = 1;
	f[cnt].v = x;
	f[cnt].pri = rand();
}
void update(int k)
{
	f[k].num = f[f[k].ls].num+f[f[k].rs].num+1;
}
int merge(int k1, int k2)
{
	if(!k1||!k2) return k1+k2;
	if(f[k1].pri<f[k2].pri)
	{
		f[k1].rs = merge(f[k1].rs, k2);
		update(k1);
		return k1;
	}
	else
	{
		f[k2].ls = merge(k1, f[k2].ls);
		update(k2);
		return k2;
	}
}
void split(int k, int &L, int &R, int x)
{
	if(!k) return L = R = 0, void();
	if(f[k].v<=x) L = k, split(f[k].rs, f[k].rs, R, x);
	else R = k, split(f[k].ls, L, f[k].ls, x);
	update(k);
}
int kth(int k, int x)
{
	if(f[f[k].ls].num+1==x) return f[k].v;
	if(f[f[k].ls].num>=x) return kth(f[k].ls, x);
	return kth(f[k].rs, x-f[f[k].ls].num-1);
}
int find(int x)
{
	int L, R, p, tmp, tr, res = INT_MAX;
	split(rt, L, R, x);
	int pd;
	if(L) tmp = kth(L, f[L].num), res = abs(x-tmp), pd = 1;
	if(R) tr = kth(R, 1), abs(tr-x)<res?res=abs(tr-x), pd = 2:res = res;
	if(pd==1) split(L, L, p, tmp-1);
	else split(R, p, R, tr);
	rt = merge(L, R);
	return res;
}
void insert(int x)
{
	newnode(x);
	int L, R;
	split(rt, L, R, x);
	rt = merge(merge(L, cnt), R);
}
int main() 
{
	srand(NULL);
	cin >> n;
	For(i, 1, n)
	{
		int op, x;
		cin >> op >> x;
		if(op)
		{
			if(d[0]) ans = (ans+find(x))%mod, --d[0];
			else insert(x), ++d[1];
		}
		else
		{
			if(d[1]) ans = (ans+find(x))%mod, --d[1];
			else insert(x), ++d[0];
		}
	}
	cout << ans << endl;
	return 0;
}

提交记录

2025/6/29 02:05
加载中...