社区讨论
关于代码细节的一点疑惑
学术版参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo320wju
- 此快照首次捕获于
- 2023/10/23 23:30 2 年前
- 此快照最后确认于
- 2023/10/23 23:30 2 年前
我在写文艺平衡树的时候用的fhq,在调试代码后发现一个问题:
CPP#include<bits/stdc++.h>
using namespace std;
const int N(100010);
struct node {
int l, r;
int val;
int key;
int siz;
int tag;
} tr[N];
int root, idx;
mt19937 rnd(time(nullptr));
int newnode(const int &v) {
tr[++idx].val = v;
tr[idx].key = rnd();
tr[idx].siz = 1;
return idx;
}
void pushup(const int &p) {
tr[p].siz = tr[tr[p].l].siz + tr[tr[p].r].siz + 1;
}
void pushdown(const int &p) {
if (!tr[p].tag || !p) return;
swap(tr[p].l, tr[p].r);
tr[tr[p].l].tag ^= 1, tr[tr[p].r].tag ^= 1;
tr[p].tag = 0;
}
void split(int p, int k, int &x, int &y) {
if (!p) {x = y = 0; return;}
pushdown(p);
if (k > tr[tr[p].l].siz) {
k -= tr[tr[p].l].siz + 1;
x = p;
split(tr[p].r, k, tr[p].r, y);
}
else {
y = p;
split(tr[p].l, k, x, tr[p].l);
}
pushup(p);
}
int merge(const int &x, const int &y){
if (!x || !y) return x + y;
if (tr[x].key < tr[y].key) {
pushdown(x);
tr[x].r = merge(tr[x].r, y);
pushup(x);
return x;
}
else {
pushdown(y);
tr[y].l = merge(x, tr[y].l);
pushup(y);
return y;
}
}
void reverse(const int &l, const int &r) {
int x, y, z;
split(root, r, x, z);
split(x, l - 1, x, y);
tr[y].tag ^= 1;
root = merge(merge(x, y), z);
}
void output(const int &p) {
if (!p) return;
pushdown(p);
output(tr[p].l);
printf("%d ", tr[p].val);
output(tr[p].r);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
root=merge(root,newnode(i));
for(int x,y,i=1;i<=m;i++){
scanf("%d%d",&x,&y);
reverse(x, y);
}
output(root);
return 0;
}
将
split()的第一个形参p的类型改成常量引用,每次运行的时候会随机输出不同的结果,改成值引用就对了,为甚么呀?回复
共 1 条回复,欢迎继续交流。
正在加载回复...