Tricks

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

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

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

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

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

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

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

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

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

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

posted @ 2024-03-15 15:05  CharlieVinnie  阅读(46)  评论(0编辑  收藏  举报