ARC156

怎么会有人看错题 + 写一车 bug,同分数垫底啊 /cf/cf/cf

A

分类讨论。

时间复杂度 \(\mathcal{O}(n)\)

B \((\texttt{Easy} \ 1 / 0)\)

枚举最大的 \(\rm mex\) 是多少,限制为一些位置必须要用掉一次操作,其余任意,组合数求和即可。

时间复杂度 \(\mathcal{O}(n + k)\)

C \((\texttt{Easy} \ 2 / 1)\)

钦定 \(p_{p_i} = i\),则答案 \(> 1\) 当且仅当两个匹配有交,且并还是一条路径。

以重心为根分为若干子树,每次选择最大的两个子树中的点匹配即可。同一子树中的点需要按照深度从小到大选择。注意有两个重心的情况。

时间复杂度 \(\mathcal{O}(n \log n)\)\(\mathcal{O}(n)\)

D \((\texttt{Easy} \ 3 / 1)\)

由 Lucas 定理得 \(\sum c_i x_i\) 有贡献当且仅当 \(c_i\) 的和为 \(k\),且没有重复的为 \(1\) 的位。于是我们可以转而为每个 \(k\)\(1\) 的二进制位安排数。

\(f_{i, s}\) 表示选到 \(2^i\) 的为,当前剩余的和为 \(s\),所有方案的异或和,则若 \(k\) 的第 \(i\) 位为 \(1\),需要枚举这一位给哪个数,同时还要记录一下方案的奇偶性。

时间复杂度 \(\mathcal{O}(\omega n \log k)\),其中 \(\omega = 2^{10}\)

E \((\texttt{Easy} \ 4 / 2)\)

冷静下来想想,其实这题并不难。但是放到赛时肯定过不了(

\(s = \sum x_i\),显然地,\(x\) 合法的必要条件是:

  • \(2 \mid s\)
  • \(\forall i, x_i + x_{i + 1} \le \frac{s}{2}\)

可以通过归纳证明其也是充分的。

发现至多有两个位置不合法,考虑容斥。

首先,钦定若干个 \(x_i > m\),可以得到总的方案数为

\[\sum_{i = 0} ^ n (-1)^i \binom{n}{i} \binom{k - i(m + 1) + n - 1}{n - 1} \]

接下来我们考虑违反第二个条件的情况。不妨钦定为 \(x_1 = j, x_2 = i, x_1 + x_2 > \frac{s}{2}\),则等价于剩下 \(n - 2\) 数的和与 \(i + j\) 的奇偶性相同,且 \(< i + j\)

\(f_i\) 表示 \(n - 2\)\(\le m\) 的数和为 \(\le i\) 的与 \(i\) 奇偶性相同的方案数,则上面的方案数为 \(f_{\min\{i + j - 2, k - i - j\}}\)

但是对于一些情况,我们会计算两次。不妨钦定为 \(x_2 = i, (x_1, x_3) = (j, x)\),其中后者为无序对,且 \(j \le x\),则等价于剩下 \(n - 3\) 个数的和与 \(i + j + x\) 的奇偶性相同,且 \(< i + j - x\)

枚举 \(i, j\),设 \(g_i\) 表示 \(n - 3\)\(\le m\) 的数和为 \(\le i\) 的与 \(i\) 奇偶性相同的方案数,则上面的方案数为 \(2 \sum_{x = j} ^ {lim} g_{\min\{i + j - x - 2, k - i - j - x\}}\),其中 \(lim = \min\{m, k - i - j\}\)

乘上 \(2\) 是因为 \(x_1, x_3\) 有两种摆放方案,因此要把 \(k = j\) 的贡献加一个回来。发现这是区间和的形式,再求一下 \(g\) 的前缀和即可。

因为 \(i + j \le 2m\),所以 \(f, g\) 预处理到 \(2m\) 即可,可以暴力计算。

时间复杂度 \(\mathcal{O}(m^2 + n + k)\)

F \((\texttt{Medium} \ 6 / 2)\)

好牛逼啊,不知道怎么想到的。

首先,一个显然的上界可以通过网络流得到:

  • \(s \to i\) 有一条流量为 \(1\) 的边;
  • \(i \to 2n + a_i, i \to 2n + b_i\) 有一条流量为 \(1\) 的边;
  • \(2n + x \to 2n + \omega + x\) 有一条流量为 \(1\) 的边;
  • \(2n + \omega + a_i \to n + i, 2n + \omega + c_i \to n + i\) 有一条流量为 \(1\) 的边;
  • \(n + i \to t\) 有一条流量为 \(1\) 的边。

这张网络的最大流表示将操作改为每次从两个数组中选择一个加入 或不加入 所得到的最大值。

接下来我们证明这个最大值可以达到。

先把所有 \(a\) 中出现过的数全部选一个出现的位置流了,我们考虑证明:若每次流最短的增广路,则一定合法。

证明:反证法。假设出现了非法的点 \(i\)\(n + i\),不妨设为 \(i\),肯定是因为它的 \(x_i \in \{a_i, b_i\}\) 被退流了。设其原来对应的点为 \(j\)。这时,不难证明用 \(s \to i \to 2n + x_i \to j\) 替换之前增广路到 \(j\) 的部分,增广路长度会缩短,故不会出现非法的点。

于是在残量网络上跑最大流即可。

时间复杂度 \(\mathcal{O}(n \sqrt n)\)

总结:要多从几个方面思考上界,例如本题就是放宽了操作的条件,然后通过构造说明上界可以达到。

posted @ 2023-02-20 16:42  Scintilla06  阅读(68)  评论(0编辑  收藏  举报