Loading

题解-AGC056

赛时 AC:A B C

补题:DEF

A (Easy)

首先爆搜得到 \(N = 6...11\) 的答案。

\(n\) 拆分成若干个 \([6,11]\) 的正整数 \(n_1,n_2,...,n_k\),然后把这些矩阵拼起来即可。

aclink

B (Medium)

考虑如何判断一个方案是否可行:每次找到一个可能的最大值,然后按这个最大值分成两个子区间递归处理。

考虑原问题。我们现在要计算一段区间 \([l,r]\) 满足条件的方案数:

显然我们要找到 \(\ge 1\) 个可能的最大值,因此如果我们找到了 \(k\) 个最大值,我们乘以 \((-1)^{k-1}\) 的容斥系数,并把整个区间分成 \(k+1\) 个子区间处理。

这个可以再加个 \(\rm DP\) 处理,时间复杂度 \(\Theta(n^3)\)

aclink

C (Easy+)

\(0\) 附上 \(-1\) 的权值,\(1\) 附上 \(1\) 的权值。令 \(v_i\) 表示第 \(1\) 个到第 \(i\) 个字符的权值和。

限制分为两种:

  1. \(|v_i - v_{i - 1}| = 1\)
  2. \(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}\) 即可。

aclink

F (Medium+)

大概是猜个结论,然后转成折线问题,转换成另一个柿子,然后再计数。

题解比较难写,咕了。

posted @ 2021-12-07 09:34  zhoukangyang  阅读(588)  评论(0编辑  收藏  举报