可以在 cnblog 中阅读。
见这种题比较少,写篇题解加深印象。
如果直接上数据结构维护数组,似乎没有好的办法处理操作序列的一个子段。那不妨转变思路,对操作序列上数据结构维护。
假设顺序进行每个修改操作,我们用时间表示修改操作的编号,位置表示数组的下标,则常见的维护序列的数据结构实际是对位置维度维护,这里我们对时间维度维护。
我们把询问挂在其对应位置 \(k\) 上,位置指针一遍从 \(1\) 扫到 \(n\),在扫描到位置 \(i\) 的时候,为获取当前位置的询问答案,我们需要位置 \(i\) 在不同时间发生的变化量。
这么说可能有些抽象,具体来说就是要支持一个序列 \(T\),\(T_j\) 记录第 \(j\) 个修改操作的生效情况,生效为 \(x\),失效为 \(0\)。\(T\) 也可以看做时间轴。
可以把修改操作在位置维度上离线下来,用差分技巧拆成两次单点修改,实际意义对应:位置指针在左端点时修改操作生效,在右端点之后失效。
根据前面的思路,我们按位置编号递增处理询问,询问 \((k,s,t)\) 的答案就是位置指针在 \(k\) 时,时间轴 \(T\) 上 \([s,t]\) 区间内的最大子段和。
回头看需要,我们要维护一个序列,支持单点加,询问区间最大子段和,这是经典线段树问题,只需在线段树上维护最大前缀和、最大后缀和、区间答案、区间和即可。参考 P4513。
标签:题解,位置,Value,修改,序列,CF1906F,操作,维护 From: https://www.cnblogs.com/tai-chi/p/18421485