关于 FHQ-Treap 效率的疑问
  • 板块学术版
  • 楼主WaterSun
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/4/30 13:30
  • 上次更新2024/4/30 18:17:20
查看原帖
关于 FHQ-Treap 效率的疑问
383395
WaterSun楼主2024/4/30 13:30

RT。

众所周知,FHQ-Treap 的 merge 函数需要比较两个节点的随机权值以此来保证不退化成链。

于是我们有了这样的代码:

inline int merge(int x,int y){
	if (!x || !y) return x + y;
	if (tr[x].hval < tr[y].hval){
		rs(x) = merge(rs(x),y);
		pushup(x); return x;
	}
	else{
		ls(y) = merge(x,ls(y));
		pushup(y); return y;
	}
}

但是如果改成这样,就过不了模板:

inline int merge(int x,int y){
	if (!x || !y) return x + y;
	if (rnd() < rnd()){
		rs(x) = merge(rs(x),y);
		pushup(x); return x;
	}
	else{
		ls(y) = merge(x,ls(y));
		pushup(y); return y;
	}
}

神奇的是,这种写法可以帮助我们通过 P5610 这个毒瘤卡常题。

2024/4/30 13:30
加载中...