ARC-122
A
简单 \(DP\),令 \(f_{i, 0 / 1}\) 表示当前考虑完前 \(i\) 个数,当前位置是否填了 \(-\) 的贡献之和。
考虑维护一个 \(g_{i, 0 / 1}\) 状态与 \(f\) 一致,存储方案数,这样就可以 \(\mathcal{O}(1)\) 转移了。
复杂度 \(\mathcal{O}(n)\)。
B
显然答案可以使用 \(x\) 表示出来,分析单调性可知只有可能在给出的点上取到。
然后随便怎么算都可以。
C
写了个乱搞,不太会证次数正确。
考虑假设最终状态为 \((n, x)\),考虑使用辗转相除的方法构造,使用次数可以 \(\mathcal{O}(\log n)\) 计算。
注意到构造形式与斐波那契数列非常像,于是我们取 \(x = \dfrac{n}{\frac{\sqrt{5} + 1}{2}}\) 左右的数拿进去计算次数,取最小的出来即可。
大概可以跑 \(T = 10 ^ 6\) 组数据,可以通过。
(其实我交的不是这个,但本质上与这个相同且这个更为简便)。
正解应该是 齐肯多夫表示法。
D
首先博弈是假的,因为 \(Bob\) 可以预先想好对自己最优的分组方式,然后依据 \(Alice\) 的选择总是可以对应着选。
于是问题就转化为:
- 给定 \(2n\) 个元素,需要将其分为 \(n\) 组,每组 \(2\) 个元素。使得任意一组异或和的最大值最小。
考虑按位贪心,统计当前位 \(1\) 的个数 \(cnt\)。
- 若 \(cnt\) 为奇数,那么意味着这一位必定会产生贡献。
同时我们可以只让一个组在这一位产生贡献且这样显然最优,那么就只要管这个组的贡献了。
直接暴力将这些数暴力插入 \(\tt trie\),然后暴力查询最小值即可。
接下来这些数都不需要管,这部分的复杂度显然为 \(\mathcal{O}(n \log W)\)。
- 若 \(cnt\) 为偶数,那么必定要将 \((0, 0), (1, 1)\) 这样分组,否则这一位就会产生贡献。
那么我们将这一位为 \(0\) 的数和这一位为 \(1\) 的数分别拿下去递归下一位即可。
这部分复杂度也为 \(\mathcal{O}(n \log W)\),因此总复杂度为 \(\mathcal{O}(n \log W)\)。
E
显然后面位置的限制大且不会对该位置之前的位置决策产生影响,因此我们考虑从后往前填。
假设将 \(a_i\) 填在后面,那么合法的判定条件为:
后者显然会爆 \(long long\),通常的处理办法是修改判定条件引入 \(\gcd\)。
不难发现可以将条件修改为:
可知右边的大小不会超过 \(a_i\),因此是可以直接算的。
由于数据范围很小,直接暴力即可:\(\mathcal{O}(n ^ 3 \log W)\)。
F
首先可以注意到一点性质:
- 若 \(Rx_i \le Rx_j, Ry_i \le Ry_j\) 那么第 \(i\) 个红球是不需要管的。
因此我们首先将不需要管的球去掉,保证:\(Rx_{i - 1} < Rx_i, Ry_{i - 1} > Ry_i(2 \le i \le n)\)。
此时我们有如下重要观察:
- 无论每个蓝球移动到哪里,最终可以覆盖的红球一定是一个区间(可能为空)。
于是问题转化为:
每个蓝球可以选择覆盖任意一个区间,需要一定的花费。目标是每个红球被覆盖至少 \(k\) 次的基础上最小化花费。
这是一个区间 \(k\) 覆盖类型的问题,可以简单地转化为重复 \(k\) 次,每次选择一些蓝球使得所有红球被覆盖至少 \(1\) 次(蓝球选择不重复)。
此时我们不妨先考虑 \(k = 1\) 的情况。
对于 \(i\) 号蓝球,如果需要覆盖 \([l, r]\) 这段红球区间,那么花费为:\(\max(0, Ry_l - By_i) + \max(0, Rx_r - Bx_i)\)。
注意到两个维度的花费互不干扰,可以将两个维度拆开考虑。
考虑费用流,对于两个维度值域 \((W)\) 上的所有整点建点,按照如下方式连边:
- \((X_{i - 1} \rightarrow X_i, 1, \infty), (X_i \rightarrow X_{i - 1}, 0, \infty)(1 \le i \le W)\)
- \((Y_{i - 1} \rightarrow Y_i, 0, \infty), (Y_i \rightarrow Y_{i - 1}, 1, \infty)(1 \le i \le W)\)
- \((X_{Rx_i} \rightarrow Y_{Ry_{i + 1}}, 0, \infty)(1 \le i < n)\)
- \((Y_{By_i}, X_{Bx_i}, 0, 1)(1 \le i \le m)\)
此时 \(Y_{Ry_1} \rightarrow X_{Rx_n}\) 的一点流量所花的最小费用即为 \(k = 1\) 的答案。
根据开始提到的区间 \(k\) 覆盖的解法,只需将流量添加至 \(k\) 时的最小费用即为任意 \(k\) 的答案。
注意到初始费用全非负,使用原始对偶复杂度 \(\mathcal{O(k(n + m)\log (n + m))}\)。