求条
查看原帖
求条
1401095
zhangchengqi666楼主2025/2/5 20:00

10pts求条

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 80000 + 5;

struct node {
	int son[2];
	
	int fa, val, sz;
} tree[N];

int n, root, num, ans, cnt;

multiset<int> st;

void pushup(int x) {
	tree[x].sz = tree[tree[x].son[0]].sz + tree[tree[x].son[1]].sz + 1;
}

bool get(int x) {
	return x == tree[tree[x].fa].son[1];
}

void rotate(int x) {
	int y = tree[x].fa, z = tree[y].fa, d = get(x);
	if (tree[x].son[d ^ 1]) tree[tree[x].son[d ^ 1]].fa = y;
	tree[y].son[d] = tree[x].son[d ^ 1];
	tree[x].son[d ^ 1] = y;
	tree[x].fa = z;
	tree[y].fa = x;
	if (z) tree[z].son[tree[z].son[1] == y] = x;
	pushup(y);
	pushup(x);
}

void splay(int x) {
	for (int f = tree[x].fa; f; rotate(x), f = tree[x].fa) 
		if (tree[f].fa) rotate(get(x) == get(f) ? f : x);
	root = x; 
}

void ins(int val) {
	if (!root) {
		tree[++num].val = val;
		root = num;
		pushup(root);
		return;
	} 
	int tmp = root, f = 0;
	while (true) {
		f = tmp;
		tmp = tree[tmp].son[tree[tmp].val < val];
		if (!tmp) {
			tree[++num].val = val;
			tree[num].fa = f;
			tree[f].son[tree[f].val < val] = num;
			pushup(num);
			pushup(f);
			splay(num);
			break;
		}
	} 
} 

int pre(void) {
	int tmp = tree[root].son[0];
	if (!tmp) {
		return tmp;
	}
	while (tree[tmp].son[1]) {
		tmp = tree[tmp].son[1];
	} 
	splay(tmp);
	return tmp;
}

int nxt(void) {
	int tmp = tree[root].son[1];
	if (!tmp) {
		return 2e11;
	} 
	while (tree[tmp].son[0]) {
		tmp = tree[tmp].son[0];
	}
	splay(tmp);
	return tmp;
}

int rnk(int val) {
	int ans = 0, tmp = root;
	while (true) {
		if (val < tree[tmp].val) {
			tmp = tree[tmp].son[0];
		} else {
			ans += tree[tree[tmp].son[0]].sz;
			if (!tmp) {
				return ans + 1;
			} 
			if (tree[tmp].val == val) {
				splay(tmp);
				return ans + 1;
			}
			ans += 1;
			tmp = tree[tmp].son[1];
		}
	}
}

void del(int val) {
	rnk(val);
	if (!tree[root].son[0]) {
		int tmp = root;
		root = tree[root].son[1];
		tree[root].fa = 0;
		tree[tmp].son[0] = tree[tmp].son[1] = tree[tmp].val = tree[tmp].fa = tree[tmp].sz = 0;
		return;
	} else if (!tree[root].son[1]) {
		int tmp = root;
		root = tree[root].son[0];
		tree[root].fa = 0;
		tree[tmp].son[0] = tree[tmp].son[1] = tree[tmp].val = tree[tmp].fa = tree[tmp].sz = 0;
		return;
	} else if (!tree[root].son[0] && !tree[root].son[1]) {
		tree[root].son[0] = tree[root].son[1] = tree[root].val = tree[root].fa = tree[root].sz = 0;
		root = 0;
		return;
	}
	int tmp = root, x = pre();
	tree[tree[tmp].son[1]].fa = x;
	tree[x].son[1] = tree[tmp].son[1];
	tree[tmp].son[0] = tree[tmp].son[1] = tree[tmp].val = tree[tmp].fa = tree[tmp].sz = 0;
	pushup(root);
}

signed main(void) {
	ins(-2e11);
	ins(2e11);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int opt, x;
		cin >> opt >> x;
		if (opt == 0) {
			ins(x);
			cnt++;
			if (!st.empty()) {
//				cout << ans << "      " << cnt << "      " << st.size() << endl;
				auto p1 = st.lower_bound(x), p2 = st.upper_bound(x);
				if (abs(x - *p1) == abs(x - *p2)) {
					ans = (ans % 1000000 + abs(x - *p1) % 100000) % 1000000;
					st.erase(p1);
				} else {
					if (abs(x - *p1) > abs(x - *p2)) {
						ans = (ans % 1000000 + abs(x - *p2) % 100000) % 1000000;
						st.erase(p2);
					} else {
						ans = (ans % 1000000 + abs(x - *p1) % 100000) % 1000000;
						st.erase(p1);
					}
				}
				del(x);
				cnt--;
//				cout << ans << "      " << cnt << "      " << st.size() << endl;
			}
		} else {
			if (cnt > 0) {
//				cout << ans << "      " << cnt << "      " << st.size() << endl;
				st.insert(x);
				ins(x);
				int p1 = pre(), p2 = nxt();
				del(x);
				if (abs(x - tree[p1].val) == abs(x - tree[p2].val)) {
					ans = (ans % 100000 + abs(x - tree[p1].val) % 1000000) % 1000000;
					del(tree[p1].val);
					cnt--;
				} else {
					if (abs(x - tree[p1].val) > abs(x - tree[p2].val)) {
						ans = (ans % 100000 + abs(x - tree[p2].val) % 1000000) % 1000000;
						del(tree[p2].val);
						cnt--;
					} else {
						ans = (ans % 100000 + abs(x - tree[p1].val) % 1000000) % 1000000;
						del(tree[p1].val);
						cnt--;
					}
				}
				st.erase(x);
//				cout << ans << "      " << cnt << "      " << st.size() << endl;
			}
		}
	} 
	cout << ans;
	return 0;
}
2025/2/5 20:00
加载中...