李超树

这里并不想写那些基础的部分。这部分只提一句,就是李超树所维护的函数当然不止是一次函数,事实上,所有满足如下性质的函数它都能维护

  • 对于任意两个函数族中的函数 \(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\),而把直线当作标记来维护。下传标记时,如果此处已经有一个标记,我们事实上只需要往其中一个方向传递,这就保证了下传标记复杂度的正确性。

事实上是不是这才应该是李超树的正确理解方式,我们把直线当成标记,这样这两个所谓的扩展的做法其实都是显然的。

posted @ 2024-07-12 17:26  PYD1  阅读(4)  评论(0)    收藏  举报