「AGC046 补题记录」


省选晚上的 AGC,今天 vp 了一下,拿到了大众题数 ABCD。EF 题等我有时间再说吧。

目前进度 4/6。


A - Takahashikun, The Strider

problem link。

answer = 360 / gcd(X, 360)

submission。


B - Extension

problem link。

被这道 sb 题卡了,把 C 题切了过后回来才知道咋做。

第一想法:定义 f(i, j) 表示现在已有 i 行 j 列的方案数,枚举下一次填行/列。

为了避免算重,考虑怎么唯一生成一种方案:尽量先扩展行,再扩展列。
也就是说,扩展一连串列过后必须紧接扩展一行,且这一行必须在最新的列里填黑。

对应到 f(i, j) 的转移:
(1)扩展行:\(f(i-1,j)\times j\)
(2)扩展列:\(\sum_{k<j} f(i-1, k)\times (i-1)^{j-k}\)

初值为 \(f(A, B) = 1\);最后答案为 \(\sum_{i=1}^{D} f(C,i)\times C^{D-i}\)

时间复杂度 \(O(n^3)\),随手优化一下 \(O(n^2)\)

submission。


C - Shift

problem link。

转化一下操作:设有 m 个 0,将序列分成 m + 1 段,第 i 段有 ai 个 1。
则操作等价于选择 i < j,ai++,aj--(aj > 0)。

从后往前 dp,定义 \(f(i, j, k)\) 表示处理到第 i 位,后面减了 j 次,当前总操作次数是 k。

枚举当前位最终状态是增加还是减少(注意不能考虑过程中的先增后减/先减后增,不然会算重)进行转移。

看起来是 \(O(m\times|S|^3)\)
冷静分析一下发现 1 的总数只有 \(O(|S|)\) 个,如果我们每次 k 只取 \(\sum_{p>i} a_p\),则总复杂度是 \(O(|S|^3)\)

update in 2020/07/02:经评论提醒,这部分复杂度分析的关键在于,转移时枚举减少量的总量为 \(\sum a_i = O(|S|)\),因此分析出来是 \(O(|S|^3)\)
上面那种证明并不是本质问题所在(虽然看着很有道理)

submission。


D - Secret Passage

problem link。

\(f(i, x, y)\) 表示后 i 位固定,有 x 个自由的 0,有 y 个自由的 1,是否合法。

初始值 \(f(n, 0, 0) = 1\),转移时枚举前两个是 0/1/2 个自由 0/1。

为了避免算重,如果 \(f(i, x, y)\) 对应的方案严格包含 \(f(j, x', y')\)(显然有 \(j > i\)),则最后将 \(f(j, x', y')\) 置为不合法。

\(g(i,x, y)\) 表示后 i 位固定,有 x 个自由的 0,有 y 个自由的 1,能够组合出的方案数。

边界状态 \(g(0, x, y) = \binom{x+y}{x}\)
后 i 位构成的串一定是生成串的子序列,因此仿照子序列匹配的过程进行 dp 即可。

最后答案显然为 \(\sum f(i, x, y)\times g(i, x, y)\)

submission。


E - Permutation Cover

下次一定。


F - Forbidden Tournament

下次一定。

posted @ 2020-06-30 09:40  Tiw_Air_OAO  阅读(87)  评论(2编辑  收藏