【学习笔记】分块凸包
啊啊啊啊我不会凸包啊啊啊啊啊啊凸包怎么学啊啊啊啊啊啊啊啊啊(已黑化
好像很套路,用于解决一类区间加一段等差数列,求最大/最小值的问题。
upd. 刚了解到有个东西叫 KTT 可以更快的解决这个问题,回头学一下再补。
upd. 别写,过不去 APIO T2。
P4192 旅行规划
简单的题意转化,可以转化成:
维护一个序列 \(a_i\),维护两种操作:
- 给定 \(v, k\),然后令每个 \(a_i\) 加上 \(\min(i, v) \times k\)。
- 求 \([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\)。