ARC066D

首先,题意转化为求若干个连续段的答案。

考虑 DP。设 \(f_i\) 表示考虑前 \(i\) 个数,强制不选 \(i\) 时最大的价值和。显然,有:

\[f_i = \max_{j = 1}^{i - 1} \{ f_j + C {i - j \choose 2} - s_{i - 1} + s_j \} \]

同理,设 \(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\)

显然,有如下的转移式:

\[h_i = \max_{l < i < r} \{ f_l + g_r + C {r - l \choose 2} - s_{r - 1} + s_l \} \]

直接求时间复杂度是 \(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\) 有:

\[p_j = \max_{k = \text{mid} + 1}^{R} \{ f_j + g_k + C {k - j \choose 2} - s_{k - 1} + s_j \} \]

这也是一个可以斜率优化的式子,那么李超线段树即可。

由主定理,总时间复杂度为 \(O(n \log^2 n)\),常数小,可以通过。

posted @ 2025-04-23 17:13  Eliauk_FP  阅读(6)  评论(0)    收藏  举报