杂题口胡

其实是对着题解贺

ARC058F

\(\mathcal{Link}\)

考虑暴力 DP,设 \(f_{i,j}\) 表示前 \(i\) 个串中长度为 \(j\) 的最优串。

注意到字典序具有良好的性质:对于有希望成为最优解的 \(f_{i,j}\)\(f_{i,k}\)\(j<k\)),\(f_{i,j}\) 必为 \(f_{i,k}\) 前缀(注意要判断能否拼成长度为 \(m\) 的串,这是容易的)。
所以我们可以对所有 \(i\) 维护一个母串 \(s_i\),这样只需要用 \(f_{i,j}\) 记录是否有用就好了,空间变为 \(\mathcal O(nm)\)

考虑转移: \(f_{i,j}=\min(f_{i-1,j},f_{i-1,j-|a_i|}+a_i)\)。我们可以先算出 \(f_{i,j}\) 的值(只需要记录哪个转移更优就好了),然后用单调栈维护当前有用状态即可,最后可以由栈顶更新出 \(s_i\)

所以我们具体要干的就是判断 \(f_{i,j}\)\(f_{i,k}\) 的大小。发现每个 \(f_i\) 都是由 \(f_{i-1}\)\(s_i\) 拼成的,所以可以使用 Z 函数算出 \(\operatorname{lcp}\) 即可快速判断,实在不会可以用哈希。

复杂度 \(\mathcal O(nm+\sum |s|)\)

CF1268E

\(\mathcal Link\)

考虑在退化成树时,直接边权从大到小 \(\mathcal O(m)\) 维护即可。

当存在环时,可能会在加边 \((u,v)\) 时多算一些 \(u,v\) 都能到的点。显然这只会在成环的时候出现,且最小边一定通过两侧都能走到最大边 \((p,q)\),那么重复贡献的就是能通过环上最大边走到的点,即对应两点在加入最大边前所能到的点。

直接 DP 就好了。

posted @ 2023-03-12 21:44  pref_ctrl27  阅读(21)  评论(0编辑  收藏  举报