Codeforces Round 1108 Div.2 做题记录
Codeforces Round 1108 Div.2 做题记录
Solution
A
【+4min】
\(n\) 为偶数,\(i\) 和 \(n-i+1\) 奇偶性不同。
因此令 \(a_i = n-i+1\) 即可,所有参与运算的都是偶数。
B
【+1min】
没看到 \(a_i\) 互不相同,直接输出 \(n\) 个 \(1\)。
【+5min】
发现这样一个结构:
即 \(a_i = a_{i-1} \times 2\),且 \(a_i = \sum_{j=1}^{i-1} a_j\)。
考虑这样的好处,显然是可以增量构造的,并且如果 \(1 \sim i-1\) 满足条件,那么 \(1 \sim i\) 也满足条件,且一定互不相同。
C
【+10min】
形式是 \(+,-,+,-,\dots\)。
考虑到根据一个数字的出现次数来做。如果出现次数是偶数,那么把它们加进来贡献为 \(0\)。
所以考虑到第一部分贡献,即所有出现数字均出现偶数次。
这是容易实现的。设 \(s_i\) 为第 \(i\) 种数字的出现次数,那么该部分贡献为:
【+15min】
考虑一个数字出现了奇数次怎么办,我们先考虑 \(> 0\) 的数字出现了奇数次。
那么我们容易发现,抛去 \(-1\) 部分的贡献不可能为 \(0\)。
因此,考虑用 \(-1\) 来去除这部分贡献。\(-1\) 有贡献当且仅当贡献为 \(-1\)(\(+\)),因此我们考虑 \(> 0\) 的贡献只能为 \(1\)。
会发现这只有一种情况,即 \(x,x+1\) 两相邻数字均出现奇数次,其他数字全部出现偶数次。
所以考虑把 \(-1,x,x+1\) 出现次数为偶数次的贡献去掉,加入出现次数为奇数次的贡献即可。
【+10min】
注意到一个数出现次数为奇数次的贡献等于出现次数为偶数次的贡献。
所以 \(-1,x,x+1\) 贡献修改后仍然为 \(res\),直接累加即可。
时间复杂度 \(O(n)\)。
D
【+20min】
发现如果有奇数,Bob 肯定会把奇数放在第二个位置上,让 Alice 的操作区间只有 \([1,1]\)。
容易发现 Alice 初始增加可以是为了让所有数都达到 \(2^k\) 的倍数,从而提供更多的”全局除以 \(2\)"操作。因为如果可以进行这样的操作的话,是不受奇数操作区间限制的。
【+30min】
\(k \in [0,18]\)。
【+50min】
注意到一个 corner:记 \(c_x\) 为 \(x\) 单独从 \(x\) 变为 \(0\) 的操作次数。那么可能出现 \(c_x < c_{x+k}+k\)。
不过 \(k \le 40\)(这个限制很宽松),所以枚举下即可。
以下是赛后订题部分。
注意达到 \(2^k\) 时也应该判一下这个 corner!时间复杂度两个 \(\log\)。
E
好题要懂得欣赏。
本题中,我们称 末位 为二进制下的最低位。
【+15min】
发现好像没有确定性解法,考虑随机化。
【+45min】
考虑 \(x = 1\),第一个返回的数字记为 \(v'\),第二个返回的数字为 \(c\)。
那么考虑 \(v'\) 可能的值:
- 若 \(v' = 0\),那么一定有 \(\text{ty} = \&\),\(v\) 的末位为 \(0\)。
- 若 \(v' > 1\),那么一定有 \(\text{ty} = |\),\(v\) 的 \(\log_2(v')\) 位为 \(1\)。
先考虑以上两种情况,容易发现,我们知道了 \(v'\) 的固定一位(即第 \(\log_2(v')\) 位,记为 \(k\))。
那么接下来我们只需要令 \(m_0,m_1\) 的第 \(k\) 位分别为 \(0,1\),就能通过异或后的值还原出 \(m_0/m_1\) 的第 \(k\) 位的值,从而确定 \(m_0\) 还是 \(m_1\),即确定 \(b\)。
【+30min】
- 若 \(v' = 1\),此时存在两种情况。
- \(\text{ty} = |\),\(v = 0\)。
- \(\text{ty} = \&\),\(v\) 的末位为 \(1\)。
先考虑 \(\text{ty} = |\),\(v = 0\)。此时因为 \(v = 0\),有一个很优美的性质是 \(m \oplus v = m\)。因此只要 \(m_0,m_1\) 不同,我们就能区分它们,找到 \(b\) 的值。
而如果 \(\text{ty} = \&\),\(v\) 的末位为 \(1\)。此时我们考虑用 \(m_0,m_1\) 的最后一位区分它们。同时我们还需要确保这不会与 \(v = 0\) 混淆。
因此,我们这里随机 \(m_1\) 奇数,\(m_0\) 偶数。这样 \(v = 0\) 即判断 \(c = m_0 / m_1\) 即可。冲突的概率极小,是 \(2^{-29}\),可以通过本题。
F
【+10min】
考虑判定无解。
从逆序对的角度考虑,容易发现每次操作的逆序对数量变化是一个 \(2d-n\) 的形式,当 \(n\) 为偶数时,每次变化都是偶数。如果初始逆序对数为奇数,此时一定无解。
【+30min】
考虑增量构造。假设已经求出了 \([\dots,1,2,3,4,\dots,x-1]\),现在考虑把 \(x\) 移到最后面。
那么分类讨论 \(x\) 的位置 \(p\)(有 \(a_p = x\)):
- \(p = n\):不用动。
- \(1 < p < n\):直接对 \(p-1\) 操作。
- \(p = 1\):有点小复杂。
- 考虑先把 \(x\) 放到 \(>1\) 的位置上,即对 \(2\) 操作。
- 此时 \(n\) 位置会多一个杂数,\(x\) 的位置来到 \(2\)。然后我们先把 \(x\) 放到这个数后面,即对 \(1\) 操作。
- 最后对 \(n-1\) 操作,杂数被放到了 \(1\) 的位置,而 \(x\) 被放置到了 \(n\) 的位置上。
【+15min】
考虑一些 corner,首先是 \([n-1,n,1,2,3,4,\dots]\) 的形式(按照上述做法做会导致 \(1\) 成为杂数放到最前面,成为 \([1,n,2,3,4,\dots,n-1]\) 的形式)。
这其实是好做的。简单手玩一下,容易发现:
- 先按照 \(p = 1\) 的情形进行操作,变成 \([1,n,2,3,4,\dots,n-1]\)。
- 然后只需要对 \(1\) 位置操作即可,\(n\) 被放到最后面。
【+5min】
注意 \(n = 2\) 的 corner,\(a = [1,2]\) 会导致我们无法对 \(2\) 操作。
因此不妨逆序对数为 \(0\) 的直接特判掉。
【+40min】
最后的 corner 是 \([n,n-1,1,2,3,4,\dots]\) 的形式。
如果你直接开始手玩的话,恭喜你怎么也玩不出来。
先分析下性质,此时逆序对数为 \((n-2)+(n-1) = 2n-3\)。
\(2n-3\) 是一个奇数,因此 \(n\) 不能是偶数,只能是奇数!
然后你再手玩一下,就可以玩出来了:
- 先对 \(1\) 位置操作,变成 \([n,1,2,3,4,\dots,n-1]\)。
- 然后再对 \(2\) 位置不断操作,这样 \([3,n]\) 这个区间里面的数会进行 循环移位,共进行了 \(n-2\) 次。在此过程中,\(2\) 位置上的数会不断 \(7,1,7,1,7,\dots\) 交替。
- \(n-2\) 次操作后,由于 \(n\) 为奇数,所以 \(a_2\) 会由 \(7\) 变为 \(1\)。此时也就形成了 \([1,n,2,3,4,\dots]\)。
- 现在只需要对 \(1\) 位置操作即可,皆大欢喜!
粗略分析下各部分的操作次数。
- 增量构造部分:\(3(n-2)\) 次。
- corner 部分:至多 \(n\) 次。
粗略估计不会超过 \(4n-6\) 次,实际只会更小。

浙公网安备 33010602011771号