Loading

题解:CF1906F Maximize The Value

可以在 cnblog 中阅读。

见这种题比较少,写篇题解加深印象。

如果直接上数据结构维护数组,似乎没有好的办法处理操作序列的一个子段。那不妨转变思路,对操作序列上数据结构维护。

假设顺序进行每个修改操作,我们用时间表示修改操作的编号,位置表示数组的下标,则常见的维护序列的数据结构实际是对位置维度维护,这里我们对时间维度维护。

我们把询问挂在其对应位置 \(k\) 上,位置指针一遍从 \(1\) 扫到 \(n\),在扫描到位置 \(i\) 的时候,为获取当前位置的询问答案,我们需要位置 \(i\) 在不同时间发生的变化量。

这么说可能有些抽象,具体来说就是要支持一个序列 \(T\)\(T_j\) 记录第 \(j\) 个修改操作的生效情况,生效为 \(x\),失效为 \(0\)\(T\) 也可以看做时间轴。

可以把修改操作在位置维度上离线下来,用差分技巧拆成两次单点修改,实际意义对应:位置指针在左端点时修改操作生效,在右端点之后失效。

根据前面的思路,我们按位置编号递增处理询问,询问 \((k,s,t)\) 的答案就是位置指针在 \(k\) 时,时间轴 \(T\)\([s,t]\) 区间内的最大子段和。

回头看需要,我们要维护一个序列,支持单点加,询问区间最大子段和,这是经典线段树问题,只需在线段树上维护最大前缀和、最大后缀和、区间答案、区间和即可。参考 P4513。

code

posted @ 2024-09-19 22:16  tai_chi  阅读(1)  评论(0编辑  收藏  举报