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\),可以得到总的方案数为
接下来我们考虑违反第二个条件的情况。不妨钦定为 \(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)\)。
总结:要多从几个方面思考上界,例如本题就是放宽了操作的条件,然后通过构造说明上界可以达到。