社区讨论
主席树 WA80tps,求掉,玄关
P3835【模板】可持久化平衡树参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mhjcyj9m
- 此快照首次捕获于
- 2025/11/04 00:32 4 个月前
- 此快照最后确认于
- 2025/11/04 00:32 4 个月前
可怜的代码:
CPP#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define il inline
#define fr(i,a,b) for(int i=a;i<=b;++i)
#define Fr(i,a,b) for(int i=a;i>=b;--i)
char buf[1048576],*p1 = buf,*p2 = buf, ubuf[1048576],*u = ubuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1048576,stdin),p1==p2)?EOF:*p1++)
inline int read() {
int x = 0, f = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + ch - '0';
return x * f;
}
const int N = 5e5 + 5, inf = 2147483647;
int n, op[N], qv[N], qx[N], lsh[N], tot, ans;
int rt[N], s[N << 6], ls[N << 6], rs[N << 6], mx[N << 6], mn[N << 6], cnt;
il void U(int p, int &k, int l, int r, int x, int v) {
if (!k) k = ++cnt;
if (l == r) {
s[k] = max(0, s[k] + v);
if (s[k]) mx[k] = mn[k] = l;
else mx[k] = -inf, mn[k] = inf;
return;
}
int m = l + r >> 1;
if (x <= m) rs[k] = rs[p], U(ls[p], ls[k], l, m, x, v);
else ls[k] = ls[p], U(rs[p], rs[k], m + 1, r, x, v);
s[k] = s[ls[k]] + s[rs[k]];
mx[k] = max(mx[ls[k]], mx[rs[k]]);
mn[k] = min(mn[ls[k]], mn[rs[k]]);
}
il int S(int k, int l, int r, int x) {
if (!k) return 0;
if (r <= x) return s[k];
int m = l + r >> 1;
if (m < x) return s[ls[k]] + S(rs[k], m + 1, r, x);
return S(ls[k], l, m, x);
}
il int Q(int k, int l, int r, int x) {
if (!k) return 0;
if (l == r) return l;
int m = l + r >> 1;
if (s[ls[k]] >= x) return Q(ls[k], l, m, x);
return Q(rs[k], m + 1, r, x - s[ls[k]]);
}
il int Mx(int k, int l, int r, int x, int y) {
if (!k) return -inf;
if (x <= l && r <= y) return mx[k];
int m = l + r >> 1;
if (y <= m) return Mx(ls[k], l, m, x, y);
if (m < x) return Mx(rs[k], m + 1, r, x, y);
return max(Mx(ls[k], l, m, x, y), Mx(rs[k], m + 1, r, x, y));
}
il int Mn(int k, int l, int r, int x, int y) {
if (!k) return inf;
if (x <= l && r <= y) return mn[k];
int m = l + r >> 1;
if (y <= m) return Mn(ls[k], l, m, x, y);
if (m < x) return Mn(rs[k], m + 1, r, x, y);
return min(Mn(ls[k], l, m, x, y), Mn(rs[k], m + 1, r, x, y));
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
n = read(), mn[0] = inf, mx[0] = -inf;
fr(i, 1, n) qv[i] = read(), op[i] = read(), qx[i] = read();
fr(i, 1, n) if (op[i] != 4) lsh[++tot] = qx[i];
sort(lsh + 1, lsh + tot + 1), tot = unique(lsh + 1, lsh + tot + 1) - lsh - 1;
fr(i, 1, n) if (op[i] != 4) qx[i] = lower_bound(lsh + 1, lsh + tot + 1, qx[i]) - lsh;
fr(i, 1, n) {
if (op[i] >= 3) rt[i] = rt[qv[i]];
if (op[i] == 1) U(rt[qv[i]], rt[i], 1, tot, qx[i], 1);
else if (op[i] == 2) U(rt[qv[i]], rt[i], 1, tot, qx[i], -1);
else if (op[i] == 3) cout << S(rt[i], 1, tot, qx[i] - 1) + 1 << endl;
else if (op[i] == 4) cout << lsh[Q(rt[i], 1, tot, qx[i])] << endl;
else if (op[i] == 5) {
ans = Mx(rt[i], 1, tot, 1, qx[i] - 1);
cout << ((ans == -inf) ? ans : lsh[ans]) << endl;
} else if (op[i] == 6) {
ans = Mn(rt[i], 1, tot, qx[i] + 1, tot);
cout << ((ans == inf) ? ans : lsh[ans]) << endl;
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...