社区讨论

萌新8pts TLE 求条

P6136【模板】普通平衡树(数据加强版)参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mls5wb8z
此快照首次捕获于
2026/02/18 23:03
16 小时前
此快照最后确认于
2026/02/19 11:54
3 小时前
查看原帖
CPP
#include <bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define A return
#define C 0
#define pub public:
#define pri private:
#define fri friend:
#define Ofile(s) freopen(s".in", "r", stdin), freopen (s".out", "w", stdout)
#define Cfile(s) fclose(stdin), fclose(stdout)
#define fast ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
I AK IOI;

using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using lb = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;

constexpr int mod = 998244353;
constexpr int maxn = 2e6 + 5;

int n, q, opt, num, root, last, ans, seed = 1;

int rerand(){
	return seed *= mod;
}

struct FHQ_Treap{
	int tot, root;
	int value[maxn];
	int priority[maxn];
	int siz[maxn];
	int ls[maxn];
	int rs[maxn];
	FHQ_Treap(){
		tot = root = 0;
		memset(value, 0, sizeof value);
		memset(priority, 0, sizeof priority);
		memset(siz, 0, sizeof siz);
		memset(ls, 0, sizeof ls);
		memset(rs, 0, sizeof rs);
	}
	void pushup(int u){
		siz[u] = siz[ls[u]] + siz[rs[u]] + 1;
	}
	void split(int u, int v, int &rootl, int &rootr){
		if (!u){
			rootl = rootr = C;
			A;
		}
		if (value[u] < v){
			rootl = u;
			split(rs[u], v, rs[u], rootr);
		}
		else {
			rootr = u;
			split(ls[u], v, rootl, ls[u]);
		}
		pushup(u);
	}
	int merge(int rootl, int rootr){
		if (!rootl)
			A rootr;
		if (!rootr)
			A rootl;
		if (priority[rootl] < priority[rootr]){
			rs[rootl] = merge(rs[rootl], rootr);
			pushup(rootl);
			A rootl;
		}
		else {
			ls[rootr] = merge(rootl, ls[rootr]);
			pushup(rootr);
			A rootr;
		}
	}
	void insert(int val){
		value[++tot] = val;
		priority[tot] = rerand();
		siz[tot] = 1;
		int s, t;
		s = t = C;
		split(root, val, s, t);
		root = merge(merge(s, tot), t);
	}
	void erase(int val){
		int i, j, u, v;
		i = j = u = v = C;
		split(root, val, i, j);
		split(j, val + 1, u, v);
		u = merge(ls[u], rs[u]);
		root = merge(i, merge(u, v));
	}
	int find(int val){
		int point = root;
		while (point){
			if (val == siz[ls[point]] + 1)
				A value[point];
			else if (val <= siz[ls[point]])
				point = ls[point];
			else 
				val -= siz[ls[point]] + 1,
				point = rs[point];
		}
	}
	int rank(int val){
		int s, t;
		s = t = C;
		split(root, val, s, t);
		int tmp = siz[s];
		root = merge(s, t);
		A tmp + 1;
	}
	int perfix(int val){
		A find(rank(val) - 1);
	}
	int suffix(int val){
		A find(rank(val + 1));
	}
} Tree;

int main() {
	freopen("std.in", "r", stdin);
	freopen("std.out", "w", stdout);
	fast;
	cin >> n >> q;
	for (int i = 1, x; i <= n; i++)
		cin >> x,
		Tree.insert(x);
	while (q--){
		cin >> opt >> num;
		num ^= last;
		if (opt == 1)
			Tree.insert(num);
		else if (opt == 2)
			Tree.erase(num);
		else if (opt == 3)
			ans ^= (last = Tree.rank(num));
		else if (opt == 4)
			ans ^= (last = Tree.find(num));
		else if (opt == 5)
			ans ^= (last = Tree.perfix(num));
		else 
			ans ^= (last = Tree.suffix(num));
	}
	cout << ans << endl;
	A C;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...