题解-AGC056
赛时 AC:A
B
C
补题:D
,E
,F
A (Easy)
首先爆搜得到 \(N = 6...11\) 的答案。
把 \(n\) 拆分成若干个 \([6,11]\) 的正整数 \(n_1,n_2,...,n_k\),然后把这些矩阵拼起来即可。
B (Medium)
考虑如何判断一个方案是否可行:每次找到一个可能的最大值,然后按这个最大值分成两个子区间递归处理。
考虑原问题。我们现在要计算一段区间 \([l,r]\) 满足条件的方案数:
显然我们要找到 \(\ge 1\) 个可能的最大值,因此如果我们找到了 \(k\) 个最大值,我们乘以 \((-1)^{k-1}\) 的容斥系数,并把整个区间分成 \(k+1\) 个子区间处理。
这个可以再加个 \(\rm DP\) 处理,时间复杂度 \(\Theta(n^3)\)。
C (Easy+)
给 \(0\) 附上 \(-1\) 的权值,\(1\) 附上 \(1\) 的权值。令 \(v_i\) 表示第 \(1\) 个到第 \(i\) 个字符的权值和。
限制分为两种:
- \(|v_i - v_{i - 1}| = 1\)
- \(v_{L - 1} = v_R\)
把第一种变为 \(|v_i - v_{i - 1}| \le 1\),由于差分约束不会更改奇偶性,因此一定构造出了一个合法的字典序最大的方案,反转即可得到字典序最小的方案。
由于这里的边权 \(\ge 0\) 且 \(\le 1\),所以可以用 \(\rm 01 \ BFS\) 优化,我偷了个懒救写了 \(\rm SPFA\)(
赛时写的东西比较奇怪,没法优化,这是赛后写的:aclink。
D (Medium+)
瞎猜了个结论过了,不会证,咕了。
E (Hard)
不放计算 \(k = n - 1\) 的答案。
枚举再每个位置放的奶酪个数 \(a_0,...,a_{n-1}\)。
再枚举从位置 \(n - 1\) 绕回到 \(0\) 的奶酪个数 \(x\)。
那么第 \(i\) 个奶酪经过的次数就是 \(b_i = x - i + \sum b_i\)。
一个奶酪不被吃的概率显然是 \(2^{-b_i}\)。
对于 \(k < n - 1\),第 \(k\) 个奶酪被吃,概率是 \(1 - 2^{-b_k}\)。
对于 \(k = n - 1\),第 \(k\) 个奶酪不被吃,概率是 \(2^{-b_k}\)。
因此把这些概率全部乘起来,可以表示成 \(\sum 2^{-ix} p_i\) 的形式,最后用等比数列计算,然后 \(\rm DP\) 就对了吗?
其实还不对,例如 \(n = 1\) 答案算出来是 \(2\)。这部分官方题解讲的不太详细,这里仔细讲一下。
我们分析一下奶酪行走的流程:
首先由若干奶酪被放置后,走到了 \(n - 1\) 还没被吃掉。设有 \(r\) 个。
有 \(x\) 个奶酪奶酪从 \(n - 1\) 绕回到 \(0\)(同一个奶酪绕多次算多个奶酪)
这 \(x\) 个奶酪中有 \(x - r\) 个是从 \(0\) 重新回到 \(n - 1\)。给这些奶酪标记为 \(0\)。
这 \(x\) 个奶酪中有 \(r\) 个是从 \(0\) 走到某个位置被老鼠吃掉了。给这些奶酪标记为 \(1\)。
这 \(x\) 个奶酪的标记序列是一个字符串,比如 01001000001000
。
被放置且走到 \(n - 1\) 后还没被吃掉的 \(r\) 个奶酪,对应的从 \(0\) 开始走的奶酪分别是:
第一个被放的:01
。
第二个被放的:001
。
第三个被放的:000001
。
也就是说一个奶酪是经过了若干圈(0
),最后在某一圈被老鼠消灭(1
)。
但是注意到最后多出了三个无家可归的 0
。而这些 0
是被要求不存在的,因为他根本没有起点。
我们观察最后的 \(c\) 个 0
对答案产生的什么影响:每个 0
都要求了最后剩下的那只老鼠不要把奶酪消灭,因此给答案贡献了 \(\frac{1}{2^c}\) 的系数。
因此我们原先计算的答案事实上是真实答案的 \(\sum_{c = 0} \frac{1}{2^c} = 2\) 倍。因此最后把答案乘以 \(\frac{1}{2}\) 即可。
F (Medium+)
大概是猜个结论,然后转成折线问题,转换成另一个柿子,然后再计数。
题解比较难写,咕了。