算法讲解
其实不用讲,看标题就知道这大概是一个什么样的算法了。
它用来解决这样类型的问题:你要支持,从一个点往一个区间中的所有点连一条边,或者一个区间中的所有点连一条边(有向)。
然后你就要进行一些 最短路/强连通分量/最大流 等图论基本操作了。
那么这个咋整呢(⊙.⊙)
假设我们现在是从第 ⑨ 个点向 [ 3 , 6 ] [3,6] [3,6] 区间中的所有点连边。可以如下图处理:
先建一颗线段树,这颗线段树上的每一个非叶子节点都向它的两个儿子连了一条有向边。
接着,我们把 [ 3 , 6 ] [3,6] [3,6] 在线段树上拆分一下,变成 [ 3 , 4 ] + [ 5 , 6 ] [3,4]+[5,6] [3,4]+[5,6]。然后我们从 9 9 9 连到线段树节点 [ 3 , 4 ] [3,4] [3,4],还有 [ 5 , 6 ] [5,6] [5,6],这样就可以 O ( log n ) O(\log n) O(logn) 的时空复杂度实现一次区间连边了,是不是很神奇呢~~(✪ω✪)
(我当时是被这个算法骚到了,吓的我目瞪口呆)
那么这个父子之间的有向边,边权多少呢?首要原则是,不能影响答案,比如你要求最大流,那么影响答案的就是路径最小值,此时要把边权都设置为 I N F INF INF。如果是求最短路,那影响答案的就是路径和,此时把边权设置为 0 0 0 就好了 (*▽*)
然后我们怎么从区间连向点呢?我们再建一颗树,这颗树的父子边是从儿子到父亲的有向边。然后再把区间拆分一下即可,和上面基本一样,就是反个方向☆daze~
还是那句话(韩信带净化),只有你们想不到,没有出题人出不到,咱们去挑战一把毒瘤例题咯 ~❤
起飞
T1. 超级经典のCF786B Legacy
(诶诶诶别吓我嗷,B 题就 *2600?
(对,没错,这就是 div.1 的神仙,自闭了 o(╥﹏╥)o
这题基本就是板子了(板子也毒瘤的要死),支持 m m m 个三种形式的连边操作:
- 有向边 u → w v u\xrightarrow[w]{\qquad} v uwv
- 区间连点 [ l , r ] → w