FHQ Treap 求调 0pts(玄关)
查看原帖
FHQ Treap 求调 0pts(玄关)
1403609
Begemot楼主2024/8/1 19:13
#include <iostream>
typedef long long ll;
const int MAXN = 2e5 + 5;
using namespace std;
int n, a;
int rt, idx, T1, T2, T3, res;
struct Node {
	int ls, rs, val, key, f, maxf, sz;
} tree[MAXN];
int add_node(int v, int f) {
	tree[++idx] = {0, 0, v, rand(), f, f, 1};
	return idx;
}
void push_up(int u) {
	tree[u].sz = tree[tree[u].ls].sz + tree[tree[u].rs].sz + 1;
	tree[u].maxf = max(max(tree[tree[u].ls].maxf, tree[tree[u].rs].maxf), tree[u].f); 
}
void split(int u, int v, int &x, int &y) {
	if (u == 0) {
		x = y = 0;
		return ;
	}
	if (tree[u].val > v) {
		y = u;
		split(tree[u].ls, v, x, tree[u].ls);
	} else {
		x = u;
		split(tree[u].rs, v, tree[u].rs, y);
	}
	push_up(u);
}
int merge(int x, int y) {
	if (!x || !y) return x + y;
	if (tree[x].key > tree[y].key) {
		tree[x].rs = merge(tree[x].rs, y);
		push_up(x);
		return x;
	} else {
		tree[y].ls = merge(x, tree[y].ls);
		push_up(y);
		return y;
	}
}
void insert(int x, int f) {
	split(rt, x, T1, T2);
	rt = merge(merge(T1, add_node(x, f)), T2);
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> a;
		split(rt, a - 1, T1, T2);
		int tmp = (tree[T1].sz ? tree[T1].maxf + 1 : 1);
		res = max(res, tmp);
		rt = merge(T1, T2);
		insert(a, tmp);
		cout << res << endl;
	}
	return 0;
}

总是在几行后输出比答案多1的数字

2024/8/1 19:13
加载中...