cf Global Round 31 CDE
很早就听说了这场题出得比较逆天,体验了一下发现还真是。被 CD 这两个题虐爆了qwq。。。E 题看着也挺不错的,遂来补题。
C. XOR-factorization
\(k\) 为奇数时显然全填 \(n\) 最优。考虑 \(k\) 为偶数时的情况:
一个特别容易错的贪心:填 \(k-2\) 个 \(n\),剩下两个数分别为 \(a, b\),并最大化满足 \(a \oplus b = n\),且 \(a \leq n, b \leq n\) 的两个数 \(a, b\) 之和。这样做的错误在于:没有贪心地使得高位 \(1\) 的数量最大化。
正确的贪心做法应该是:对于所有数,需要按照高位到低位的顺序,每次填某个固定二进制位上的数字,并最大化该位填 \(1\) 的数量。需要注意的是值域为 \([0, n]\),因此某个数的高位填 \(1\) 时注意不能填冒。同时,我们还需要对每个数维护一个 \(bool\) 变量 \(free_{i}\),表示该数当前位是否能随便填数字(当该数的某一高位是 \(0\),而 \(n\) 上相应位是 \(1\) 时为 true,表示后面无论怎么填数字,大小都不会超过 \(n\))。具体实现:假设当前在填高 \(c\) 位,前面的高位都已填完:
- 若 \(n\) 在该位上的数字是 \(1\),则可以确定该位上填 \(1\) 的数字数量是 \(k-1\),因为此时的值域限制没有用,尽可能地填 \(1\) 是最优的。而唯一的 \(1\) 个 \(0\),应当贪心地分配给 \(free\) 值为 false 的数,使得其 \(free\) 值变为 true,这样更有利于后续操作。
- 否则,该位上填 \(1\) 的数量,应该是 \(\leq freecnt\) 的最大偶数。 往相应的 \(free\) 值为 true 的数上填 \(1\) 即可。
具体实现见代码。吐槽:这题作为 div1+2 的 C 题实在太超模了,1900分。。。
D. Insolvable Disks
考察贪心和不等式约束。这道题蒟蒻吭哧吭哧补了半天才补出来,官方题解也看不明白一点,感觉自己真的不擅长这种偏开放思维的题qwq。。。
对于 \(1 \leq i < n\),我们依次考虑第 \(i\) 个圆和第 \(i + 1\) 个圆是否能相切。二者能相切当且仅当二者半径之和等于二者之间的距离,而一个圆的半径取值范围只与它左右两个相邻圆的圆心位置和半径有关,因此我们考虑用 两侧的圆心位置 与 左侧圆半径的取值范围 (从左向右递推,已计算完)去递推右侧圆的半径取值范围,并判断这两个圆是否能相切。若能相切则继续递推下一个圆;否则只能从这里断开,此时第 \(i + 1\) 个圆的半径取值范围就不再受第 \(i\) 个圆的半径影响,只与左右两个圆的圆心位置有关。重新计算该半径的取值范围并往后递推即可。
这里再贴一下官方题解的思路,利用了一些不等式约束限制条件来推演,和上面的方法大体是差不多的,但上面的方法明显简单很多。
E. No Effect XOR
题意:给定区间 \([l, r]\),求满足 \(\forall i \in [l, r]\),\(i \oplus x \in [l, r]\) 的所有正整数 \(x\) 的数量,\(l, r \leq 10^{15}\)。
根据样例打表发现,答案极有可能形式为 \(2^{x}-1\),事实证明确实是这样。
根据异或交换律:设 \(i \oplus x = y\),则 \(i \oplus y = x\)。而 \(i, y\) 均 \(\in [l, r]\),故 \(i\) 和 \(y\) 在 \([l,r]\) 内一定是成对出现的,可相互交换,且 \(i \neq y\)(否则 \(x = 0\),不是正整数了)。因此 \([l, r]\) 的长度必须是偶数。这是本题比较容易发现的一个特判。
若 \(l = r\),则答案为 \(1\)。
否则 \(l < r\),我们尝试找到 \(l\) 和 \(r\) 的二进制中数字不同的最高位(设为第 \(k\) 位)。容易发现,该位往前的更高位上,\([l, r]\) 的所有数字一定是全 \(1\) 或全 \(0\),故 \(x\) 对应二进制位一定不能是 \(1\),否则会出现无法匹配的情况。
现在分类讨论在这一位上,\(x\) 对应二进制位取 \(0\) 或 \(1\) 的情况:
- 若填 \(0\),则 \(i \oplus x\) 后,该位数字保持不变,配对一定分别发生在 该位是 \(0\) 与该位是 \(1\) 的两个集合内部,每个集合内部分别作匹配。于是,根据该位将 \([l, r]\) 分成 \([l, 2^{k})\) 与 \([2^{k}, r]\) 两部分。
- \([2^{k}, r]\):等价于 \([0, r - 2^{k}]\);计算对于该区间数字的两两匹配,\(x\) 有多少种取值。 首先,后面几位全取 \(0\) 一定可行,即每个数匹配的都是自己;从低到高依次决策 \(x\) 的每个二进制位:若 \(x_{0} = 1\),则必须保证区间内所有数的二进制第 \(0\) 位上 \(0\) 与 \(1\) 数量相等,才能相互匹配;对于高位也是如此。并且,若低位无法做到匹配,高位一定也无法匹配。 因此,我们得出结论:合法 \(x\) 的数量与区间右端点的末尾连续 \(1\) 的数量相关。设 \(R = r - 2^{k}\) 的末尾连续 \(1\) 数量为 \(p\),则合法 \(x\) 的数量为 \(2^{p}\)。
- \([l, 2^{k})\):等价于 \([0,l)\)。因为 \([l,2^{k})\) 中所有数可以两两匹配,等价于 \([0,l)\) 内的数可以两两匹配。于是此时情况的计算与上一个情况类似,只不过 \(R = l\)。1 与 2 均须满足,因此要取两种情况结果的最小值,作为 \(x\) 最高位填 \(0\) 时的答案。
- 若填 \(1\),显然在区间中该位上的 \(0\) 与 \(1\) 的数量就要相等,才能两两匹配。显然此时要求区间中点 \(mid\) 必须对于该位上的 \(0\) 和 \(1\) 严格划分,即将 \([l,r]\) 划分为 \([l,mid]\) 与 \([mid+1,r]\) 两部分,\(mid = \lfloor \frac{l+r}{2} \rfloor\) 且 \(mid + 1\) 必须是 \(2\) 的幂次。注意此时两个子区间需要互相匹配,显然,此时后面的若干低位全取 \(1\) 时一定可以相互匹配,计算思路和上面完全一样:从低到高依次决策 \(x\) 的每个二进制位,看除了填 \(1\) 外,是否还能填 \(0\),且仍然保持低位不满足高位必然也不满足这一性质。结论是与 \(r - mid\) 的末尾连续 \(1\) 的数量相关。
最后别忘了将答案减 \(1\),因为 \(x=0\) 不算入答案。


浙公网安备 33010602011771号