李超树
这里并不想写那些基础的部分。这部分只提一句,就是李超树所维护的函数当然不止是一次函数,事实上,所有满足如下性质的函数它都能维护
-
对于任意两个函数族中的函数 \(f,g\) 最多只能有一个交点。或者说,一旦其中一个“超过”另外一个,那么接下来这个相对大小关系一直保持。
-
可以快速单点求值。并且给定一个位置和两个函数,可以快速知道交点在这个位置的哪边。
Extended Lichao Tree
它可以解决这样的问题
-
\(\forall i\in[l,r],A_i\leftarrow\max(A_i,ai+b)\)。
-
\(\forall i\in[l,r],A_i\leftarrow A_i+ai+b\)。
-
单点查询。
如果只有 1,3 操作,那么显然李超树是可以解决的。加入 2 操作之后,我们有一个打标记上去的冲动,这是因为一次函数相加仍然是一次函数,有很好的封闭性。
问题是,比这个标记更高的位置我们无法影响到。比方说我们加了 \([2,n-1]\),然后又插入了 \([1,n]\) 的直线,在插入时我们没办法取得之前的信息,所以就爆炸了。
为了让这个标记影响到更高的位置,我们需要把它们都给干掉。具体来说,pushdown 下来就行了。
然后我们就可以打标记了,打标记就是普通打标记,包括下传什么的都是平凡的。
它还可以解决
-
\(\forall i\in[l,r],A_i\leftarrow\max(A_i,ai+b)\)。
-
\(\forall i\in[l,r],A_i\leftarrow A_i+b\)。
-
\(\max_{i\in[l,r]}A_i\)。
只有操作 1 3,我们考虑每个节点额外维护一个 \(mx\)。或者说我们本来就是维护 \(mx\),而把直线当作标记来维护。下传标记时,如果此处已经有一个标记,我们事实上只需要往其中一个方向传递,这就保证了下传标记复杂度的正确性。
事实上是不是这才应该是李超树的正确理解方式,我们把直线当成标记,这样这两个所谓的扩展的做法其实都是显然的。

浙公网安备 33010602011771号