Codeforces Round 965 (Div. 2) 题解
个人难度顺序:A < D < B < C < E。
A. Find K Distinct Points with Fixed Center
如果 \(k\) 是偶数,构造 \((x_c + i, yc + i)\),其中 \(- \frac{k}{2} \le i \le \frac{k}{2}\)。
对于 \(k\) 是奇数,先加一个点 \((xc, yc)\),然后就变成偶数的情况了。
B. Minimize Equal Sum Subarrays
先猜只有 \([1, n]\) 的和相等。
做前缀和,问题就变成了 \(sump_{r} - sump_{l} \neq sumq_{r} - sumq_{l}\)。
移项可得 \(sump_{r} - sumq_{r} \neq sump_{l} - sump_{l}\)。
这就是在说,对于 \(i \neq n\),\(\Delta_i = sumq_i - sump_i\) 互不相等。
然后枚举构造方式,发现可以构造 \(q_i = p_i \bmod n + 1\)。
不难发现,如果 \(p_i < n\),则 \(\Delta_i = \Delta_{i - 1} + 1\);如果 \(p_i = n\),则 \(\Delta_i = \Delta_{i - 1} - (n - 1)\)。
观察到只有 \(\Delta_0 = \Delta_n = 0\),所以这个构造是对的。
C. Perform Operations to Maximize Score
只会没有脑子的做法。
首先发现,让中位数增大的代价一定不比让 \(a_i\) 增大的代价小。
所以说对于 \(b_i = 1\) 的 \(i\),我们一定是让 \(a_i\) 变为 \(a_i + k\),贡献为 \(a_{i} + k + \operatorname{median}(c_i)\),删掉一个数时 median 的排名变化是 \(O(1)\) 的,可以暴力。
对于 \(b_i = 0\) 的 \(i\),我们要让 \(\operatorname{median}(c_i)\) 尽可能大。
考虑如果只有一个 \(b_i = 0\)。
求中位数我们会二分一个 \(mid\),将 \(a_i \le mid\) 的位置标记为 0,其余位置标记为 1。
如果 0 的数量小于中位数的排名,就说明 \(\operatorname{median}(c_i) > mid\),所以我们的目标是让 0 的数量尽可能少。
这一步可以贪心去做,就是将每个位置按从 0 变 1 的代价从小到大排序,然后从前往后取,知道代价大于 \(k\)。
这样就完成了 check,可以通过先从大到小排序将 check 优化到 \(O(n)\)。
现在我们有很多个 \(b_i = 0\),考虑整体二分。
发现 \(b_i = 0\) 的位置并不能是 0 的个数改变,所以 check 和上面是一样的。
然后就做完了。
时间复杂度 \(O(n \log V)\)。
D. Determine Winning Islands in Race
如果 Elsie 能一步跨过 Bessie 走过的路,那么他就赢了,也就是说只有额外边能决定胜负。
所以先求出从 1 到每个点 \(u\) 的距离 \(dis_u\),然后枚举每条额外边 \((u, v)\)。
发现 \((u, v)\) 这条边只能让 Elsie 在 \((u, v - dis_u - 1)\) 这几个点赢。
求答案的话就差分一下,时间复杂度 \(O(n)\)。
E1. Eliminating Balls With Merging (Easy Version)
只会笨蛋做法。
首先你会暴力,就是枚举每个位置 \(i\),维护它能吸收的区间 \([l, r]\),然后 \(l\) 和 \(r\) 分别往两边扩。
但你仔细想想,如果你跨过了一个原本不能跨过的位置,那么 \(a_i\) 一定是翻倍的,所以只会扩展 \(O(\log V)\) 次,每次扩展可以通过 ST 表+二分实现。
时间复杂度 \(O(n \log n \log V)\)。
E2. Eliminating Balls With Merging (Hard Version)
考虑在上一个题的基础上分别求出 \(l\) 扩展到 1 时 \(r\) 能扩展的最大位置和最小位置,这样做个前缀和就好了。
时间复杂度 \(O(n \log n \log V)\)。
是 P9530 [JOISC2022] 鱼 2 的超级弱化版。