社区讨论

关于代码细节的一点疑惑

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...