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''\)

而此时又有

\[\begin{align} s'+s''+s''' &= s_i - s_j \\ s_0'-s_0''+s'' &= s_i-s_j-s''' \\ s''-s_0'' &= s_i-s_j-s'''-s_0' \\ \end{align} \]

而我们注意到 \(s''\)\(p_i\) 增大是单调不增的,而 \(s_0''\)\(p_i\) 增大又是单调不降的。因此,\(s'' - s_0''\) 的值随 \(p_i\) 增大也是单调不增的。

因此二分即可,时间复杂度 \(O(n \log^2 n)\)

注意一些 corner,需要三个树状数组。

posted @ 2026-07-27 13:51  xiang_you  阅读(7)  评论(0)    收藏  举报