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)\)。