题意:数轴上有一个动点 ,初始时可以位于任意整点处。
每一时刻可以把
往左移动一个单位、往右移动一个单位或者不动。
接着有 个点出现,第 个点会在第 时刻出现在 坐标处,然后马上消失。保证 严格递增。
如果 在 时刻恰好出现在 处,那么就能接到这个点。
得分是每一段连续接到点的极长区间的长度平方和。最大化得分。
,时限 。
复习好题。
显然,若决定接第
个点,那么就能确定 时刻 的位置。
但是,极长段的平方并不好处理,若记录当前段的长度,则状态过多,我们考虑每次直接决策一段。
如果 和
个点能同时接到,则称它们在一块内。
这样,整个序列就被合成了若干个块,最终的极长段一定是块的(恰好一个)子区间。
设 为前 个点能得到的最大收益。
枚举当前快内的开头
,然后枚举上一段的开头 ,则有
:
可以预处理 这样就可以 。
现在来分别优化 的转移。
将 视为点
,那么能贡献的点就是一个前缀矩形。可以树状数组。
对每一段分别做。 这就是一个经典的斜率优化问题了。
斜率 单调下降,代入变量
单调增加,需要维护下凸壳,使用单调栈。
这部分复杂度 。
是个半在线问题,两个转移分别要求按照 的顺序来做,似乎无法兼容。
但是,由于
的转移总在一块内,也就是
均有序的一段,所以直接按照
为序,块内出现顺序就是对的。
需要同时维护多个栈。
复杂度 。