Uoj#187. 【UR #13】Ernd

题意:数轴上有一个动点 ,初始时可以位于任意整点处。

每一时刻可以把 往左移动一个单位、往右移动一个单位或者不动。

接着有 个点出现,第 个点会在第 时刻出现在 坐标处,然后马上消失。保证 严格递增。

如果 时刻恰好出现在 处,那么就能接到这个点。

得分是每一段连续接到点的极长区间的长度平方和。最大化得分。

,时限


复习好题。

显然,若决定接第 个点,那么就能确定 时刻 的位置。

但是,极长段的平方并不好处理,若记录当前段的长度,则状态过多,我们考虑每次直接决策一段。

如果 个点能同时接到,则称它们在一块内。

这样,整个序列就被合成了若干个块,最终的极长段一定是块的(恰好一个)子区间。

为前 个点能得到的最大收益。

枚举当前快内的开头 ,然后枚举上一段的开头 ,则有 :

可以预处理 这样就可以


现在来分别优化 的转移。

视为点 ,那么能贡献的点就是一个前缀矩形。可以树状数组。

对每一段分别做。 这就是一个经典的斜率优化问题了。

斜率 单调下降,代入变量 单调增加,需要维护下凸壳,使用单调栈。

这部分复杂度


是个半在线问题,两个转移分别要求按照 的顺序来做,似乎无法兼容。

但是,由于 的转移总在一块内,也就是 均有序的一段,所以直接按照 为序,块内出现顺序就是对的。

需要同时维护多个栈。

复杂度