AGC044 部分题解

B

不会做,自闭了 /kk

考虑走了一个人之后更新他周围的人的最短路,只要能够更新就一直 bfs 更新。

虽然看上去像是 \(\mathcal O(n^4)\) 的,但是每次更新之后 \(\mathrm {dis}\) 至少减少 \(1\),而 \(\sum \mathrm {dis}_{i, j} = \mathcal O(n^3)\),所以时间复杂度就是 \(\mathcal O(n^3)\)

C

和之前出现过几次的原题很像。

从低位到高位建三进制 trie,加法就是将三个儿子换一下,另外那个操作就直接打个标记。

时间复杂度 \(\mathcal O(3^n + n|T|)\)

D

首先想个办法将每种字符的出现次数搞出来,可以每次问 \(128\) 个一样的字符,如果返回的答案是 \(x\),那么这个字符的出现次数就是 \(128 - x\)

然后可以发现,如果一个串 \(T\)\(S\) 的子序列,那么编辑距离就恰好是 \(|S| - |T|\)

进而想到某天的考试题,可是那个题目只有 abc 三种字符,而这里有 \(62\) 种,直接套用就会爆炸。

考虑对字符种类分治,设 Div(l, r) 表示将第 \([l, r]\) 种字符合并起来的字符串。

考虑如何将两个字符串合并,就直接将第二个字符串的字符一个一个插进第一个串中,不停地询问是否是 \(S\) 串的子序列就能做到了。

询问次数为 \(\mathcal O(L \log 62)\),不需要特别精细的实现也能过。

E

这个环就非常离谱,但是可以发现如果从 \(A_i\) 最大的那个位置开始的话,最优策略一定是马上结束,所以可以从 \(A_i\) 最大的位置处分开,断环为链,然后令 \(A_{n + 1} = A_1\)

dp,设 \(f_i\) 表示从点 \(i\) 开始最多能获得的期望收益,有 \(f_i = \max\left( A_i, \frac {f_{i - 1} + f_{i + 1}} 2 - B_i \right)\)

然后以 \(A_i\) 为初值迭代个几百次就能过样例(

这个有后效性的 dp 可以优化,先来看一个简单一点的转移方程是如何优化的:

结论:对于形如 \(g_i = \max\left( A_i, \frac {f_{i - 1} + f_{i + 1}} 2 \right)\) 的转移方程,可以考虑将 \((i, A_i)\) 当做点来求一个上凸包,然后将所有在凸包内的点上移到凸包的边上,最后求出来的点就是 \((i, g_i)\)

可以这样感性理解:首先在凸包上的点一定不会再被更新,然后考虑迭代的过程,可以发现一个点受到别的点的影响之后会上移,但是一定不会移出凸包,最多就只能更新到凸包的边上,而这就是最终的答案。

考虑如何将 \(f\) 变成和 \(g\) 类似的转移,定义序列 \(c\) 满足 \(c_{i - 1} + c_{i + 1} = 2 (B_i + c_i)\),然后令 \(h_i = f_i - c_i\),就有:

\[\begin{aligned} h_i &= \max\left( A_i - c_i, \frac {h_{i - 1} + h_{i + 1}} 2 + \frac {c_{i - 1} + c_{i + 1}} 2 - c_i - B_i \right)\\ &= \max\left( A_i - c_i, \frac {h_{i - 1} + h_{i + 1}} 2\right) \end{aligned} \]

大功告成。

posted @ 2020-11-26 10:53  xgzc  阅读(196)  评论(2编辑  收藏  举报