[LOJ6213]「美团 CodeM 决赛」radar
条评论斜率优化什么的太难写了啊。。。。
首先发现,一个三角形高度越高,它新增一格高度的时候增加的面积就越多。那么一个三角形要么就不选,要么就提升到最高。
那么把每个三角形按照右端点排序,然后dp。假设$f(i)$表示决定了第前$i - 1$个三角形的选择情况,且选择了第$i$个三角形的最优收益,那么$f(i) = \max \lbrace f(j) - s(i, j) | 1 \le j < i \rbrace + a_i - cost_i$($s(i, j)$表示第$i$个三角形和第$j$个三角形重合的面积,$a_i$表示第$i$个三角形的面积,$cost_i$表示把第$i$个三角形提到最高的代价)。
设$l_i$为第$i$个三角形的左端点,$r_i$为第$i$个三角形的右端点,那么如果$r_j < l_i$,那么$s(i, j) = 0$,否则$s(i, j) = \frac{(r_j - l_i)^2}{4}$。注意的$l_j > l_i$的时候,这个式子是不对的,但是可以证明直接这么计算并没有关系。证明如下:
- 可以发现$f(i)$不会从$l_j > l_i$的三角形转移过来,因为这样三角形$i$包含了三角形$j$,显然是不优的。但是可以把这样的$j$的考虑进来,因为这样算出来的重合面积$>$实际的重合面积。
处理$r_j < l_i$的转移的时候,可以维护一下前缀的$\max$,然后二分出最大的$j$满足$r_j < l_i$。
处理剩下的的转移的时候,可以直接忽视$r_j \ge l_i$的限制,直接把$s(i, j)$视作$\frac{(r_j - l_i)^2}{4}$。因为这样的话$s(i, j) \ge 0$,肯定不比把$s(i, j)$视作$0$优。
然后使用斜率优化就可以解决此题了。
然而由于我太懒了,写了一个$O(n \log^2 n)$的好写做法。
因为可以使用斜率优化,所以这个问题是决策单调的。决策单调如果离线,有一个好写的分治做法。由于这题是在线的,在外面套一层cdq分治即可。
实现的时候为了避免小数,把所有值都乘了$4$。
1 |
|