社区讨论
有关 vector 的灵异事件
学术版参与者 5已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @lo2e81p4
- 此快照首次捕获于
- 2023/10/23 12:24 2 年前
- 此快照最后确认于
- 2023/11/03 12:31 2 年前
以下代码为权值线段树实现普通平衡树 P3369
众所周知权值线段树需要动态开点,于是我尝试用 vector 来动态开点的同时动态开空间
此代码能够通过,但在注释掉主函数中 reserve 之后 0 分 WA+RE
请问是为什么
CPP#include<bits/stdc++.h>
#define pb push_back
#define endl '\n'
using namespace std;
const int V = 10000000;
int n;
struct Segment{
int ls, rs;
int cnt;
};
vector<Segment> a;
int root;
#define mid ((L + R) >> 1)
inline int newnode(){
int p = a.size();
a.pb({0, 0, 0});
return p;
}
void add(int &p, int x, int k, int L = -V, int R = V){
if (!p) p = newnode();
a[p].cnt += k;
if (L == R) return;
if (x <= mid) add(a[p].ls, x, k, L, mid);
else add(a[p].rs, x, k, mid + 1, R);
return;
}
int query(int p, int l, int r, int L = -V, int R = V){
if (!p) return 0;
if (l <= L && R <= r) return a[p].cnt;
int res = 0;
if (l <= mid) res += query(a[p].ls, l, r, L, mid);
if (mid < r) res += query(a[p].rs, l, r, mid + 1, R);
return res;
}
int kth(int p, int k, int L = -V, int R = V){
if (L == R) return L;
if (a[a[p].ls].cnt >= k) return kth(a[p].ls, k, L, mid);
return kth(a[p].rs, k - a[a[p].ls].cnt, mid + 1, R);
}
int main(){
ios:: sync_with_stdio(false);
cin.tie(0), cout.tie(0);
a.reserve(100000000);
a.pb({0, 0, 0});
cin >> n;
while (n--){
int op, x; cin >> op >> x;
if (op == 1) add(root, x, 1);
else if (op == 2) add(root, x, -1);
else if (op == 3) cout << query(root, -V, x - 1) + 1 << endl;
else if (op == 4) cout << kth(root, x) << endl;
else if (op == 5) cout << kth(root, query(root, -V, x - 1)) << endl;
else cout << kth(root, query(root, -V, x) + 1) << endl;
}
return 0;
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...