Tricks

区间加入点,区间查询直线切点

建两棵线段树,第一棵将所有修改放在根到定位节点的路径上,查询时查询所有定位到的节点(不包括路径);第二棵将所有修改放在定位到的节点上,查询时查询定位的路径

注意不能把两者都放到整条路径上,否则修改 [1,1] 和查询 [n,n] 都在根节点出现了……

树上维护所有儿子信息的方法

除了毛毛虫剖分,可以采取这样的树剖标号方式,先递归重儿子,再标所有轻儿子,再递归轻儿子,这样所有重链除了链顶连续,所有儿子除了重儿子连续:

树上当关键点距离 K 的时候连一条边,求连通块

“双向奔赴”技巧,每个点往外作半径为 K/2 的圆,则两个点距离 K 当且仅当这两个圆相交。

从所有关键点开始同时 bfs,每个点只需要被访问一次,后来的点直接合并即可。

树上倍增优化建图跑最短路优化至单 log 技巧

树上倍增优化建图的时候会建 O(nlogn) 个虚点,所以直接跑是 log2 的。但是注意到这样建出来的图往往形如“一条链和一个点之间连边”,此时我们可以应用虚点技巧,改为新建一个虚点,连一条有权边和 log0 边,然后跑最短路的时候,当访问一个点时,bfs 把它指出去的所有 0 边同时扔进优先队列。这样做的话,所有 id[i][u] 这样的倍增点都不会被扔进优先队列,精细实现(萌萌哒)可以使得虚点个数也是线性的,这样如果我们一共连了 O(m) 条“链——点”边,就只有 O(n+m) 个点被扔进过优先队列,时间复杂度 O(mlogm)

本文作者:CharlieVinnie

本文链接:https://www.cnblogs.com/Charlie-Vinnie/p/18075433

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   CharlieVinnie  阅读(59)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起