Codeforces Round 1105 Div.1 做题记录
Codeforces Round 1105 Div.1
| 编号 | CF2239 |
|---|---|
| 赛时解决 | A,B |
| 赛后订题 | A,B,C |
Solution
A
注意到 Alice 不能给 Bob 剩下多于一个的非零数字。如果这样的话,那么 Bob 还可以选两个 \(1\) 来进行操作。
因此至多剩下一个非零数字,考虑枚举留下 \(i\)。
可以通过异或前缀和 \(sum = a_1 \oplus a_2 \oplus \dots \oplus a_n\) 得到除 \(a_i\) 外的异或和 \(s = sum \oplus a_i\)。
那么此时 \(b_i = s\) 就能使 \(b\) 序列异或和为 \(0\)。大前提是 \(s \le a_i\)。
接下来注意分讨:
- 若 \(s < a_i\),那么方案数加一。
- 若 \(s = a_i\),此时序列全 \(0\),最后若存在这种情况,方案数加一。
- 换而言之,若存在若干 \(a_i\) 满足 \(s = a_i\),那么方案只能加一次。
线性时空。原来 998244353 诈骗来了。
B
先令所有人都没有礼物,然后考虑一个人获得礼物后幸福感的变化。
然后会发现每个人带来幸福感的变化是独立的。对此分析的瓶颈在于,两个有礼物的人互相的影响如何消除。
瓶颈分析:
假设 \(i-j < d\),\(i,j\) 两人都有礼物。
那么 \(i\) 先有礼物时,幸福感变化 \(+a_i-a_j\)。
后来 \(j\) 也有礼物时,幸福感变化 \(-a_i+a_j\),即两人之间无贡献。
我们又发现 \(-a_i+a_j = +a_j-a_i\),这是和 \(+a_i-a_j\) 同样的形式。
因此当 \(x\) 获得礼物时,贡献为 \((2d+1)a_x - \sum_{i = x-d}^{x+d} a_i\)。
所以谁获得礼物是没有相互影响的,因此可以配合前缀和来完成。
C
好题!
首先考虑倒着做,这样可以确定前缀对应的元素集合。
考虑极长的 \(p\) 段把 \(s\) 分开,我们设 \(i,j\) 作为 \(s\),他们中间 \([j+1,i-1]\) 是一段 \(p\)。
那么考虑 \(s_i - s_j\) 的贡献来自于哪里,无疑是以下几部分。
- \([j+1,i-1]\) 与 \([1,j]\) 产生的逆序对(记为 \(s'\))。
- \(i\) 与前面产生的逆序对(记为 \(s''\))。
- \([j+1,i-1]\) 自己内部产生的逆序对(记为 \(s'''\))。
\(s'''\) 都是可以直接计算出来的,毕竟前面的值都确定了。考虑 \(s'\) 计算。
我们这里做一步转化,把 \(i\) 先放到 \(j\) 与 \(j+1\) 之间。此时 \([j+1,i-1]\) 前方的值确定了,可以求出逆序对数量(记为 \(s_0'\))。不过这里把 \(i\) 提前,多算了 \(i\) 与 \([j+1,i-1]\) 的逆序对数量,因此还需要再减去一个 \([j+1,i-1]\) 中小于 \(p_i\) 的个数,并加上 \([j+1,i-1]\) 中大于 \(p_i\) 的个数(两者之和记为 \(s_0''\))。
现在我们就把 \(s'\) 转化为了 \(s_0' - s_0''\),其中 \(s_0'\) 可以直接计算,\(s_0''\) 则基于 \(i\) 来计算。
此时基于 \(i\) 的不确定性,存在的不确定的量有:
- \([j+1,i-1]\) 中小于 \(p_i\) 的个数 \(s_0''\)。
- \(i\) 与前面的逆序对数 \(s''\)。
而此时又有
而我们注意到 \(s''\) 随 \(p_i\) 增大是单调不增的,而 \(s_0''\) 随 \(p_i\) 增大又是单调不降的。因此,\(s'' - s_0''\) 的值随 \(p_i\) 增大也是单调不增的。
因此二分即可,时间复杂度 \(O(n \log^2 n)\)。
注意一些 corner,需要三个树状数组。

浙公网安备 33010602011771号