ARC066D
首先,题意转化为求若干个连续段的答案。
考虑 DP。设 \(f_i\) 表示考虑前 \(i\) 个数,强制不选 \(i\) 时最大的价值和。显然,有:
同理,设 \(g_i\) 表示考虑后 \(i\) 个数,强制不选 \(i\) 时最大的价值和。转移类似。
直接求时间复杂度是 \(O(n ^ 2)\) 的。但这显然是可以斜率优化的形式,可以通过维护单调栈做到 \(O(n)\)。但是这有些细节需要考虑,所以我采用了李超线段树来维护。
考虑修改操作。显然,如果不选 \(x\),那么答案就为 \(f_x + g_x\)。如果选 \(x\),那么我们需要维护一个 \(h_i\),表示强制选 \(i\) 时最大的价值。这样,选 \(x\) 时的答案就是 \(h_x + a_x - y\)。下面我们考虑如何求出 \(h_i\)。
显然,有如下的转移式:
直接求时间复杂度是 \(O(n ^ 3)\) 的,有待优化。
考虑分治。设当前分治到的区间为 \([L, R]\),区间中点为 \(\text{mid}\)。现在我们需要求转移式中 \([l, r] \subseteq [L, R]\) 时区间 \([l, r]\) 对 \(h_i\) 的贡献。\([l, r] \subseteq [L, \text{mid}]\) 或 \([l, r] \subseteq [\text{mid} + 1, R]\) 的情况可以递归计算,所以我们只需要考虑 \(l \in [L, \text{mid}]\) 且 \(r \in [\text{mid} + 1, R]\) 的情况。
考虑求出区间 \([l, r]\) 对 \(i \in [L, \text{mid}]\) 的 \(h_i\) 的贡献。设 \(p_j\) 表示 \(l = j, r \in [\text{mid} + 1, R]\) 时最大的价值和,那么显然 \(p_j\) 可以贡献到 \(i \in [j + 1, \text{mid}]\) 的 \(h_i\),且对于 \(p_j\) 有:
这也是一个可以斜率优化的式子,那么李超线段树即可。
由主定理,总时间复杂度为 \(O(n \log^2 n)\),常数小,可以通过。