当前位置: 首页 > news >正文

P2147 [SDOI2008] 洞穴勘测(LCT)

https://www.luogu.com.cn/problem/P2147

第一次学LCT,梳理一下。

LCT是基于splay的,所以Splay的两个基本函数都有:

  • Rotate:不同点在于如果 y y y 的父亲是 z z z,需要判断是否在同一棵平衡树树里在连实边。但是 x x x 的父亲一定为 z z z
  • Splay:注意,要在对 x x x 到当前平衡树根的路径倒序pushdown
void Rotate(int x) {int y = fa[x], z = fa[y]; int k = zh(x), w = son[x][k ^ 1]; if(z && !isRoot(y)) son[z][zh(y)] = x; if(w) son[y][k] = w, fa[w] = y; else son[y][k] = 0; fa[x] = z; fa[y] = x; son[x][k ^ 1] = y; 
}
void Splay(int x) {stack<int>sta; sta.push(x); for(int y = x; !isRoot(y); y = fa[y]) sta.push(fa[y]); while(!sta.empty()) push_down(sta.top()), sta.pop(); while(!isRoot(x)) {int y = fa[x], z = fa[y]; if(!isRoot(y)) {if(zh(x) == zh(y)) Rotate(y); else Rotate(x); }Rotate(x); }
}

其中LCT引入一些新函数:

  • access:把 x x x 到根的路径弄成一棵平衡树。具体操作为每次先转到当前平衡树的根,然后把父亲转到根后的右儿子设置为自己。
void access(int x) {for(int y = 0; x; y = x, x = fa[x]) {Splay(x); son[x][1] = y; }
}

其他一些函数:

  • makeRoot
    先access,在splay,然后对整棵平衡树翻转(遍历全变),打tag
  • isRoot
    父亲的左右儿子都不是自己
  • Link
    先把 x x x 转到自己那棵树的根(makeRoot),然后令 f a ( x ) = y fa(x)=y fa(x)=y
  • Cut
    先makeRoot(x),再access(y),现在平衡树里理论上只有两个点。然后先splay(y),在设置 ls(y) = fa(x) = 0
void makeRoot(int x) {access(x); Splay(x); rev[x] ^= 1; 
}
void Link(int x, int y) {makeRoot(x); fa[x] = y; 
}
void Cut(int x, int y) {makeRoot(x); access(y); Splay(y); son[y][0] = fa[x] = 0; 
}
int findRoot(int x) {access(x); Splay(x); while(push_down(x), ls(x)) x = ls(x); Splay(x); return x; }

需要push_down的地方:Splay和要在路径上走的时候


http://www.mrgr.cn/news/18059.html

相关文章:

  • Harbor部署docker私人仓库
  • springboot篇
  • 【原创】edge-tts与基于mpv的edge-playback,使命令行和Python的Text To Speech唾手可得
  • stm32f103VET6和stm32f103C8T6有什么区别?
  • 半导体是什么?
  • C# 7个方法比较两个对象是否相等
  • 【Spring Boot-IDEA创建spring boot项目方法】
  • 学懂C++(五十):深入详解 C++ 陷阱:对象切片(Object Slicing)
  • 用 BigQuery ML 和 Google Sheets 数据预测电商网站访客趋势
  • 8个考完PMP后的发展方向,建议收藏
  • python脚本处理---(不同文件夹中的文件对比、移动,提取指定类型文件、中文文件名转英文)
  • 无代码搭建网站zion
  • QSlider禁止点击 和精准点击跳转
  • FFmpeg源码:avpriv_set_pts_info函数分析
  • 快速了解开源RAG-UI工具“kotaemon”
  • 【C++11及其特性】智能指针——unique_ptr
  • 黑马点评5——优惠券秒杀—优化秒杀
  • java 根据给定的子网掩码和网关计算起始IP和结束IP
  • Unity(2022.3.41LTS) - UI详细介绍- Button(按钮)TMP
  • 【类模板】类模板的特化