【学习笔记】分块凸包

啊啊啊啊我不会凸包啊啊啊啊啊啊凸包怎么学啊啊啊啊啊啊啊啊啊(已黑化

好像很套路,用于解决一类区间加一段等差数列,求最大/最小值的问题。

upd. 刚了解到有个东西叫 KTT 可以更快的解决这个问题,回头学一下再补。

upd. 别写,过不去 APIO T2。

P4192 旅行规划

简单的题意转化,可以转化成:

维护一个序列 \(a_i\),维护两种操作:

  1. 给定 \(v, k\),然后令每个 \(a_i\) 加上 \(\min(i, v) \times k\)
  2. \([L, R]\) 之间的最大值。

第一个操作可以分成是 \([1, v]\) 加一个等差数列,然后后面区间加一个常数。

等差数列可以看作是加一个一次函数,那么我们可以分块进行处理。

对于散块就暴力重构,对于整块相当于有一个 \(a_i + k \times i\) 的形式。

我们要找 \(\max(a_i + k \times i)\),相当于找 \(y=-kx+b\)\((i, a_i)\) 的最大截距。于是可以维护一个上凸包,查询时在凸包上二分。

CF436F Banners

考虑从小到大加入每个点,对于每一个 \(p\) 维护答案 \(v_p\),那么加入了一个点就相当于把它左边的点都加上 \(p\),这就又是加等差数列问题了,还是上面的做法。

由于 \(k\) 恒定加 \(1\),所以可以用双端队列实现。

CF1178G The Awesomest Vertex

首先把 \(b\) 处理出来,然后拍到序列上,就变成了经典模型。

然后只需要把上面点的坐标改改就行了,完全类似的做法。

处理绝对值 \(\max\) 就经典,直接正负取个 \(\max\)

posted @ 2022-12-23 12:20  APJifengc  阅读(250)  评论(3编辑  收藏  举报