社区讨论
关于findroot里最后是否加Splay
P3690【模板】动态树(LCT)参与者 7已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @mi7wsk6u
- 此快照首次捕获于
- 2025/11/21 04:53 4 个月前
- 此快照最后确认于
- 2025/11/21 04:53 4 个月前
CPP
int findroot(int x){
access(x);splay(x);
while (tree[x].ch[0]) pushdown(x),x=tree[x].ch[0];
splay(x); //就这句话
return x;
}
题解1的cut,加了是可以过的:
CPPvoid cut(int x,int y){
makeroot(x);
if(findroot(y)==x&&tree[y].fa==x&&!tree[y].ch[0])
{
tree[y].fa=tree[x].ch[1]=0;
pushup(x);
}
}
但如果用了题解3的那种,加了之后就错了:
CPPvoid cut(int x,int y){
makeroot(x);
if (findroot(y)==x&&tree[x].fa==y&&x==tree[y].ch[0]&&tree[x].ch[1]==0)
{
tree[x].fa=tree[y].ch[0]=0;
pushup(y);
}
}
问一下为什么?
回复
共 10 条回复,欢迎继续交流。
正在加载回复...