Petrozavodsk Summer 2024. Day 1. Welcome Contest

\(\color{green}{\checkmark}\) 表示独立通过,\(\color{yellow}{\checkmark}\) 表示经提示后通过,\(\color{red}{\checkmark}\) 表示一点不会看的题解,\(\color{red}{\times}\) 表示到现在还是一点不会。

A. Adding Integers \(\color{green}{\checkmark}\)

考虑差分,记 \(a_0 = n, a_{q + 1} = 0\)\(a\) 的差分序列 \(b_i = a_i - a_{i+1}\)

那么原式的组合意义就是将 \(n\) 个小球放到 \(q + 1\) 个的盒子,第 \(i\) 个盒子放 \(b_i\) 个,球和盒子都有标号的方案数。

对于所有的 \(b\) 求和之后就变成 \(n\) 个小球放到 \(q + 1\) 个盒子里,球和盒子都有标号的方案数,这个就是 \((q+1)^n\)

快速幂即可。

B. Bottles \(\color{green}{\checkmark}\)

考虑固定毒药和水,往里面插入灵药。

如果毒药第一次发作是在时刻 \(x\),那么我们的要求就是在前 \(x\) 个位置中至少插入一个灵药。

那么我们现在需要求出的就是 \(f(x)\) 毒药恰好在 \(x\) 时刻发作的方案数。

做后缀和,那么就只要求 \(g(x)\) 表示毒药在 \(x\) 时刻后发作的方案数。

发现如果固定 \(x\),那么每种毒药能放的位置是一段后缀,不难算出有 \(m = \min(x - t - 1, p)\) 种毒药不能随便放,经过简单的计算即可得出 \(\displaystyle g(x) = \big(p + w - (x - t) + 1\big)^m \frac{(p + w - m)!}{w!}\)

根据 \(g(x)\) 求出 \(f(x)\) 后即可简单地算出答案,时间复杂度线性。

C. Counting Orthogonal Pairs \(\color{green}{\checkmark}\)

对于正多边形的一个角,会被分成 \(n - 2\) 个大小为 \(\displaystyle\frac{(n-2)\pi}{n}\) 的角。

记我们选的两条线段之间隔了 \(k\) 个角,那么一定满足 \(\displaystyle k \cdot \frac{\pi}{n} = \frac{\pi}{2}\),即 \(2k = n\)

因此不难得出结论,当 \(2 \nmid n\) 时答案为 0,否则为 \(\displaystyle n\left(\frac n 2 - 1\right)\)

D. Divine Tree \(\color{green}{\checkmark}\)

考虑找到 G 的个数 \(g\)B 的个数 \(b\),那么随意定根后切的边一定满足是深度较大的点的子树大小为 \(g\)\(b\)

不妨设子树大小为 \(g\),考虑如何计算答案,发现答案是 子树内所有 B 到子树根的距离和 和 子树补内所有的 G 到父亲的距离和 之和。

把有用的位置拉出来按 dfn 顺序排成序列后所有的操作都会变成区间加,查询全局最大值的形式,时间复杂度 \(O(n \log n)\)

E. Experiments With Divine Trees \(\color{green}{\checkmark}\)

考虑枚举 G 的个数 \(g\) 计算答案。

合法的可能并不好算,可以通过总方案数 \(\displaystyle \binom{n}{s}\) 减掉不合法的方案数来计算。

考虑如果固定了切哪条边,如果 G 的子树的叶子全是 BB 的子树的叶子全是 G 那么才不合法,这种情况的方案数是 \(\displaystyle \binom{n - \operatorname{leaf}(g) - \operatorname{leaf}(b)}{g - \operatorname{leaf}(b)}\)

但是有三种 corner case:

  • 有至少两种方式将切成 \((g, b)\)
  • 切的位置是链,此时能切成 \((g + 1, b - 1)\)
  • 可以切成 \((g - 1, b + 1)\)

这三种的答案都是 \(\displaystyle \binom{n}{s}\)

直接统计即可,时间复杂度线性。

F. Fruit Tea \(\color{yellow}{\checkmark}\)

考虑差分数组 \(b_i = a_i - a_{i+1}\),那么就是要求 \(b\) 中大于 0 的位置的和为 \(k\),小于 0 位置的和为 \(-k\)

考虑变成更为熟悉的形式:一条从 \((0, 0)\)\((k, k)\) 的折线,要求在 \(y = x\) 的下方,求将它切成 \(n\) 段可空直线的方案数。

如果这条折线有 \(m\)\((1, 0)\)\((0, 1)\) 的交界点,那么就总共有 \(2m\) 段。

\(a_0\) 对应着 \((0, 0)\) 这个点,\(a_{n+1}\) 对应着 \((k, k)\) 这个点,然后我们还需要找到 \(n\) 个点对应 \(a_{1 \sim n}\)

考虑先把交界点切开,共有 \(2m - 1\) 个,然后剩下的位置可以随便切,不难得出方案数为 \(\displaystyle \binom{n-(2m-1)+(2k+1)-1}{(2k+1)-1} = \binom{n-2m+2k+1}{2k}\)

下一步要计算的是 \(f_{n, m}\) 表示从 \((0, 0)\) 走到 \((n, n)\),恰好有 \(m\)\((1, 0)\)\((0, 1)\) 的交界点,路径在 \(y=x\) 下方的方案数。

这个是经典问题 dyck path with k peaks,这里提供三种做法。

第一种是考虑记它的生成函数为 \(\displaystyle F(x, y) = \sum_{n, m} f_{n, m} x^{n}y^{m}\),考虑第一次接触到 \(y = x\) 的位置,那么不难得到:

\[F = 1+x(y+F-1)F \]

\(G = F - 1\),进行拉格朗日反演可得:

\[\begin{aligned} \left[x^n\right]G &= \frac{1}{n}[x^{n-1}] \big((x+y)(x+1) \big)^n \\ &= \frac{1}{n} [x^{n-1}] \sum_{\substack{0 \le j \le n \\ 0 \le k \le n}} \binom{n}{j}\binom{n}{k} x^{j+k} y^{n- k} \\ &= \frac{1}{n} \sum_{j + k = n - 1} \binom{n}{j} \binom{n}{k} y^{n-k} \\ &= \frac{1}{n} \sum_{0 \le j \le n - 1} \binom{n}{j} \binom{n}{j+1} y^{j+1} \end{aligned} \]

不妨设 \(n \neq 0\),进一步可得:

\[[x^n y^m] F(x, y) = \frac{1}{n} \binom{n}{m - 1} \binom{n}{m} \]

第二种是考虑类似反射容斥的东西,先计算 \(g_{n, m, k}\) 表示从 \((0, 0)\) 走到 \((n, m)\),有 \(k\)转折点的方案数,这个可以通过简单的分类讨论得到:

\[\begin{aligned} g_{n, m, k} = \begin{cases} \displaystyle 2 \binom{n-1}{\frac{k+1}{2} - 1} \binom{m-1}{\frac{k+1}{2}-1} &, 2 \nmid k \\ \displaystyle \binom{n-1}{\frac{k}{2}-1} \binom{m-1}{\frac{k}{2}} + \binom{n-1}{\frac{k}{2}} \binom{m-1}{\frac{k}{2}-1} &, 2 \mid k \end{cases} \end{aligned} \]

对于一种不合法方案,找到它第一次与 \(y = x+ 1\) 接触的位置,并翻折,这是正常的反射容斥的做法。

但是对于这个问题,问题在于翻折后 \(k\) 不好确定。

解决办法是按如下构造双射使得翻折后 \(k\) 恰好减少 1:

  • 找到不合法的折线与 \(y = x+1\) 第一次接触的位置,并翻折形成走到 \((n - 1, m + 1)\) 的折线。
  • 若这条折线与 \(y = x + 1\) 相交后走的第一步 \((0, 1)\),将交点后到这一步之间的部分(包括这一步)全部删掉,形成新的折线。

这样就构造出了双射。

考虑枚举相交后向右走的步数,可以得到:

\[\begin{aligned} f_{n,k} &= g_{n, n, 2k-1} - \sum_{i \ge 0} g_{n - 1 - i, n, 2k - 2} \\ &= 2\binom{n-1}{k-1}\binom{n-1}{k-1} - \sum_{i \ge 0} \left( \binom{n-i-2}{k-2} \binom{n-1}{k-1} + \binom{n-i-2}{k-1} \binom{n-1}{k-2} \right)\\ &= 2\binom{n-1}{k-1}\binom{n-1}{k-1} - \binom{n-1}{k-1} \sum_{i \ge 0} \binom{n-i-2}{k-2} - \binom{n-1}{k-2} \sum_{i \ge 0} \binom{n-i-2}{k-1} \\ &= 2\binom{n-1}{k-1}\binom{n-1}{k-1} - \binom{n-1}{k-1} \sum_{i \le n -2} \binom{i}{k-2} - \binom{n-1}{k-2} \sum_{i \le n-2} \binom{i}{k-1} \\ &= 2\binom{n-1}{k-1}\binom{n-1}{k-1} - \binom{n-1}{k-1} \binom{n-1}{k-1} - \binom{n-1}{k-2} \binom{n-1}{k} \\ &= \binom{n-1}{k-1}\binom{n-1}{k-1} - \binom{n-1}{k-2} \binom{n-1}{k} \\ \end{aligned} \]

不难验证这个与上面的结果等价。

第三种是考虑把问题转化成这样的形式:求由 \(n\) 个 +1 和 \(n\) 个 -1 组成的序列的个数,要求满足恰好有 \(k\) 个形如 +1 -1 的子串,且每个位置的前缀和非负。

在前面加一个 +1,这样限制就变成了:\(n+1\) 个 +1 和 \(n\) 个 -1,要求每个位置的前缀和是正数。

先不管前缀和的限制,此时序列一定是恰好 \(k\) 个 +1 的连续段和 \(k\) 个 -1 的连续段交替构成的,那么计数就是对 +1 和 -1 的部分分别插板一下:\(\displaystyle \binom{n}{k - 1} \binom{n-1}{k-1}\)

我们有如下引理:

Raney 引理:若序列 \(\langle x_1, x_2, \cdots, x_m \rangle\) 是任何一个和为 +1 的整数序列,那么它的循环位移中恰好有一个满足所有前缀和都是正数。

证明见《具体数学》。

不难发现,对于一个合法的序列,它的循环位移在上面的计算中被数到了恰好 \(k\) 次(只会数到开头是 +1 结尾是 -1 的循环位移,不难发现有恰好 \(k\) 个),所以就得到了答案:

\[\frac{1}{k} \binom{n}{k - 1} \binom{n - 1}{k - 1} = \frac{1}{n} \binom{n}{k - 1} \binom{n}{k} \]

可以通过吸收恒等式得出与上面相同的结果。

其实还有一些基于拐点信息的做法,懒得写了。

时间复杂度 \(O(n)\)

G. Gold Coins \(\color{red}{\times}\)

道理我都懂,但是为啥是对的呢?

经过细致的观察,发现 01 矩阵 \(s\) 合法的充要条件是:删掉所有全 0 的行和列后,存在 \(x, y\),满足 \(s_{[1, x], [1, y]}\) 全是 1,\(s_{[x+1, r], [y+1, c]}\) 全是 0,\(s_{[1,x],[y+1,c]}\) 是合法的,\(s_{[x+1, r], [1, y]}\) 是合法的。

知道了这个之后就可以倒着 DP 了:记 \(f_{i,j }\) 表示使得 \(s_{[i, n], [j, m]}\) 合法的最小步数,转移是平凡的。

时间复杂度 \(O(n^3)\)

H. Heroes and Illusions \(\color{green}{\checkmark}\)

不妨钦定 \(a_0 = a_{n + 1} = 1\),记第 \(i\) 个 1 与上一个 1 的距离为 \(b_i\),由于奇偶性不同的位置才能贡献答案,那么可以得到答案为:\((b_1+b_3+\cdots)(b_2+b_4+\cdots) = k\)

\(b_1 + b_3 +\cdots = x\),那么有 \(x(n+1-x) = k\),解出来即可。

最后答案是把他们拼起来 \(\displaystyle \frac{1}{1 + [x = n + 1 - x]}\binom{n+1}{x}\)

I. Interesting Permutations \(\color{yellow}{\checkmark}\)

首先考虑如果固定了开头怎么做,一个观察是固定开头 \(s_1\)\(>s_1\) 的数和 \(< s_1\) 的数是相对独立的,合并的时候只需要乘一个组合数。

现在的目标就是计算 \(f_i\) 表示长度为 \(i\) 的排列合法的概率,观察是每个位置能填的数只和前缀最大值有关,所以如果想填上 \(i\),那么 \(i\) 之前必须出现 \([i - k, i)\) 中的一个数,这样就能得到转移 \(\displaystyle f_i = \frac{1}{i} \sum_{i - k \le j < i} f_j\)

对于一个查询 \((n, l, r)\),我们要计算的就是:

\[(n - 1)!\sum_{l \le i \le r} f_{i - 1} f_{n - i} \]

显然可以分块预处理,时间复杂度 \(O(q\sqrt{n \log n})\)

J. Jumping Game \(\color{red}{\checkmark}\)

没见过的结论,哎。

\(\text{Theorem}\):一张无向图,一个棋子最初在 \(s\),Alice 和 Bob 轮流将棋子沿任一出边移动一步,要求不能走到走过的点,不能移动的人输。先手必败的充要条件是存在一组最大匹配没有覆盖 \(s\)

\(\text{Proof}\):先证必要性。若存在一组没有覆盖 \(s\) 的最大匹配,那么先手第一步走完之后一定会走到一个被覆盖的点 \(u\)(否则可以将 \(s\)\(u\) 匹配使得匹配变大 \(1\)),后手的策略是走到 \(u\) 的匹配点 \(v\)。此时如果先手走到了一个点 \(t\) 没被最大匹配覆盖,那么我们可以将 \(s \rightsquigarrow t\) 上的点从 \(s\) 开始相邻两个匹配使得匹配变大 \(1\),所以 \(v\) 能走到的点一定全是被最大匹配覆盖的点。以此类推,先手每次都会走入到一组匹配中,后手会走到这组匹配的另一个点中,直到先手无路可走。

再证充分性。考虑证明它的逆否命题:若所有的最大匹配都覆盖 \(s\),则先手必胜。先手每次会从匹配的一个点走到另一个点,后手一定会从这个匹配走出去。如果走到了一个未被匹配覆盖的点 \(t\),我们一定能将 \(s \rightsquigarrow t\) 上的点从 \(t\) 开始相邻两个匹配,这样匹配大小不变,而 \(s\) 未被覆盖,矛盾。因此后手一定只能走到一个被匹配覆盖了的点。最后一定是后手在某一步无路可走。

对于这个问题,发现这个图大部分时候都是存在完美匹配的,因此只需对 \(O(1)\) 中情况分类讨论即可。

K. Kangaroo On Graph \(\color{green}{\checkmark}\)

按边做最短路即可。

L. Low Cost Set \(\color{green}{\checkmark}\)

首先一种方案是把它原有的区间全都选进去。

发现我们唯一可以做的有用的调整就是把满足 \(l_0 < l_1 < r_0 < r_1\)\((l_0, r_0), (l_1, r_1)\) 调整成 \((l_0, l_1), (l_1, r_0), (r_0, r_1)\),然后这显然是一般图最大权匹配。

posted @ 2025-06-08 14:32  definieren  阅读(78)  评论(0)    收藏  举报