Loading

Antimatter 题解

简要题意

有一个计数器 \(cnt\) 初始时为 \(0\) ,以及 \(n\) 个操作,每个有参数 \(l_i,r_i,c_i\)

每次可以从 \(n\) 个操作中选择一个(可以重复选),然后 \(cnt\) 会加上 \([l_i,r_i]\) 中随机的一个正整数,要保证 \(cnt\) 一定不会超过 \(V\) (也就是 \(cnt+r_i\leq V\)

记做选过的所有操作 \(c\) 之和为 \(C\) ,求在最坏情况下,最终 \(cnt\times 10^9-C\) 的最大值

\(n\leq 100\)\(V\leq 2,000,000\)

时空限制:\(\mathrm{2s,122MB}\)

题解

(虽然题面中 \(10^9\) 远大于 \(c_i\) 这个条件看起来是很优秀的性质,但其实没用)

考虑将“最坏情况下最好”翻译成更清晰的表达,容易想到设 \(f_i\) 为当前 \(cnt\)\(i\) ,之后所能获得的最大值(初值可以设为 \(f_i=i\times 10^9\) )

接下来按照 \(i\) 从大到小计算 \(f_i\) ,先枚举此次操作 \(j\) ,那么接下来的 \(cnt\) 可能变为 \([i+l_j,i+r_j]\) 中任一正整数,所以 \(j\) 必须满足 \(i+r_j\leq V\) 。由于是考虑最坏情况,所以选举操作 \(j\) 所转移到的状态应该是 \(\min\limits_{k=i+l_j}^{i+r_j}\{f_k\}\)

操作是我们任选的,我们希望最终结果尽可能大,所以有转移:

\[\begin{align*} f_i=\max\{f_i,\max_{j=1,i+r_j\leq V}^n\{\min_{k=i+l_j}^{i+r_j}\{f_k\}-c_j\}\} \end{align*} \]

可以发现,当 \(i\)\(n\)\(0\) 变化时,对于每个 \(j=1,2,\dots,n\)\([i+l_j,i+r_j]\) 是一段平移的区间,求这个区间的最小值,可以用单调队列实现

此时,时空复杂度均为 \(O(nV)\) ,时间复杂度已经足够优秀,但 \(n\) 个单调队列的内存难以接受,所以考虑将 \(n\) 个单调队列一起维护

这时,如果枚举当前 \(cnt\) 每个操作所对应的贡献区间过于无序,不好实现合并处理,所以更换一种转移方式:枚举 \(i\), 对于操作 \(j\) ,我们将区间 \([i,i+r_j-l_j]\)\(f\) 最小值贡献到 \(i-l_j\) 。这样,\(n\) 个操作的贡献区间左端点就对齐了。这时,我们维护一个编号的单调队列 \(Q\) ,保持它的队头到队尾 \(f\) 值递减,那么每个操作 \(j\) 对应的最小值为 \(f_{Q_{fr_j}}\) , 其中 \(fr_j\) 为使得 \(Q_{fr_j}\leq i+r_j-l_j\) 的最小正整数。这样,我们对每个 \(j\) 维护了一个队头指针 \(fr_j\),相当于维护了一个单调队列(即 \(Q_{fr_j},Q_{fr_j+1},\dots,Q_{ba}\)\(ba\) 为大单调队列 \(Q\) 的队尾)。

最终时间复杂度 \(O(nV)\) ,空间复杂度 \(O(V)\)

posted @ 2023-07-11 22:50  complexor  阅读(13)  评论(0)    收藏  举报