纪念一下赛时想出正解细节调炸心态。
找性质+二维偏序
首先拿到题没啥思路,感觉可能是高妙的数据结构但是不会。
硬着头皮写下式子:
-
对于 $j\in [x_i-p_i,x_i]$ 水位增加 $p_i-x_i+j$。
-
对于 $j\in (x_i,x_i+p_i]$ 水位增加 $p_i-j+x_i$。
可以发现最后 $j$ 位置的水位只与一个由 $p_i,x_i$ 得到的常数和 $j$ 有关,进一步发现这其实就是一个一次函数。某一次的修改会使得某个区间的函数发生改变,但始终是一次。
不妨另 $w_j=a_j+b_j\times j$,进行区间加即可预处理出每个位置的最终水位。
那么既然是一次函数了,那么极值肯定就在端点取到了。
那么不妨设 $x_i,x_i-p_i,x_i+p_i$ 为关键点,那么折线的拐点只会在这些点取到,接下来我们将只看这些关键点。
考虑水位 $>m$ 的点 $j$,标出坐标 $(j,w_j-m)$。
不妨将一场雨的影响画成一个等腰直角三角形。
如果有一个等腰直角三角形把上面标出的点全部包含,那么即意味着这场雨被消除后所有点水位都 $\leq m$。
然后把你手上的草稿纸旋转 $45\degree$,你就会发现要求的就是所有点都被包含在一个矩形中,搞搞二维偏序就行了。
可能会有一个疑问就是盖住标记点是否就能消除全部影响,即盖住整个折线。其实因为折现斜率要么是 $0$ ,也就是平的,这条线的另一头夜视被标记的点。要么斜率的绝对值 $\geq 1$,方向相同的话最多就是与当前的线平行,不可能越出这个三角形,如果方向相反则会产生另一个标记点。
异常丑陋及常数大的赛时改版代码:
1 | #include<cstdio> |

