Solution Set【2024.1.2】

发布时间 2024-01-02 21:59:01作者: User-Unauthorized

[SDOI2012] 任务安排 / 任务安排

\(f_i\) 表示前 \(i\) 个任务的最小花费,发现转移时需要前一部分分的批数,存在后效性。

考虑在每次分出新的一批任务时计算其对之后所有任务的贡献,有转移:

\[f_i = \min\limits_{j < i}\left\{f_j + st_i \left(sc_i - sc_j\right) + s\left(sc_n - sc_j\right)\right\} \]

其中 \(st_i = \sum\limits_{j \le i} T_j, sc_i = \sum\limits_{j \le i} C_j\)

上式可以化简为:

\[f_i = st_i \times sc_i + s \times sc_n + \min\limits_{j < i}\left\{f_j - s \times sc_j - st_i \times sc_j\right\} \]

斜率优化即可。

注意到每次查询的斜率不存在单调性,在单调栈上二分即可。

时间复杂度 \(O(n \log n)\)

丝之割

可以发现,若数对 \(\left(u_0, v_0\right)\) 被除去,那么所有满足 \(u \ge u_0\)\(v \le v_0\) 的数对均会被除去。

因此若将所有数对按 \(u\) 升序排列,那么剩余的有用的数对一定满足 \(v\) 严格递增。

这样之后每次消除数对一定是消除一个区间的数对,可以使用动态规划。

\(f_i\) 表示前 \(i\) 个数对的最小花费,那么有转移:

\[f_i = \min\limits_{j < i}\left\{f_j + \min\limits_{k < u_{j + 1}} a_k \times \min\limits_{k > v_{i}} b_k\right\} \]

其中 \(u_i, v_i\) 表示第 \(i\) 个数对的两个数,维护出 \(a\) 的前缀最小值和 \(b\) 的后缀最小值即可。

这样转移式就可以化为斜率优化的形式,使用斜率优化即可。

CF1599F Mars

题意可以转化为询问一个区间是否可以重排为一段模 \(P = 10^9 + 7\) 意义下的等差数列。

设等差数列的首项为 \(A\),区间长度为 \(n\),若我们得到区间内数的和 \(S\),那么根据等差数列求和公式:

\[S = n \times A + \dfrac{n\left(n - 1\right)}{2} \times d \]

我们可以得到 \(A\) 的表达式:

\[A = \dfrac{S - \dfrac{n\left(n - 1\right)}{2} \times d}{n} \]

既然已经确定了公差,首项和长度,那么我们可以计算出该等差数列的每项的 \(k\) 次方和,以达到哈希的目的,再与原区间的 \(k\) 次方和比较即可。

考虑如何求出 \(k\) 次方和,可以发现其为:

\[\begin{aligned} \sum\limits_{i = 0}^{n - 1} \left(A + di\right)^k \end{aligned}\]

可以使用二项式定理展开,得到:

\[\begin{aligned} &\sum\limits_{i = 0}^{n - 1}\sum\limits_{j = 0}^{k} \dbinom{k}{j} A_{k - j} \left(di\right)^j \\ =&\sum\limits_{j = 0}^{k} \dbinom{k}{j} A^{k - j} d^j\left(\sum\limits_{i = 0}^{n - 1} i^j\right) \\ \end{aligned}\]

\(\mathcal{O}(k)\) 计算即可。

CF713C Sonya and Problem Wihtout a Legend / 序列 sequence / CF13C Sequence / [USACO08FEB] Making the Grade G

若限制严格单调递增,可以将 \(a_i\) 均减去 \(i\),这样我们只需要使得 \(a_i\) 单调不降即可。

\(f_{i, j}\) 表示使得前 \(i\) 个数符合要求,且第 \(i\) 个数为 \(j\) 的最小花费,有转移:

\[f_{i, j} = \min\limits_{k \le j}\left\{f_{i - 1, k} + \left\lvert a_i - j \right\rvert\right\} \]

\(g\)\(f\) 的前缀最小值,那么有转移:

\[f_{i, j} = g_{i - 1, k} + \left\lvert a_i - j \right\rvert \]

考虑设 \(F_i(x) = f_{i, x}, G_i(x) = g_{i, x}\),那么可以发现其均为关于 \(x\) 的凸函数,因此可以使用 Slopt Trick 进行优化。