社区讨论
萌新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 条回复,欢迎继续交流。
正在加载回复...