CF 1045 Div.2 解题报告
A(800)
题意:给定一个长为 \(n\) 的字符串,可以进行两次长度分别为 \(a\) 和 \(b\) 的染色(会覆盖)。问最后能否形成回文串。
根据 \(a\) 和 \(b\) 的大小关系,和三个数的奇偶性进行分类讨论即可。
B(1200)
题意:给定一个数组 \(a\),你可以给每个数最多加 \(k\) 次 \(k\) 来使得最后 \(a\) 数组中所有数的最小公因数不为 \(1\)。请输出最后的数组。
看到最多加 \(k\) 次 \(k\) 和公因数,就应该想到要看模某个数的余数,然后下意识地想到模 \(k+1\)。(因为有 \(k+1\) 个剩余类,其中 \([0]\) 是我们想要的;其他 \(k\) 剩余类均可以通过至多 \(k\) 次操作转移到 \([0]\) 中)
C(1200)
题意:给定一个长度为 \(n\) 的数组 \(a\),下标从 \(1\) 开始。你可以对数组进行任意次操作,每一次操作可以对数组中一个非负元素减一。请在最小的操作次数内,使得对于任意 \(1 \le l < r \le n\),都有下标在 \([l,r]\) 中的下标为偶数的元素和大于等于下标为奇数的元素和。
原题面描述不好!考虑最极端的情况,对于一个下标为偶数 \(i\) 的元素,区间内只有它和它左右两边的元素,此时最小操作次数就为:\(a_{i+1}+a_{i-1}-a_i\)。那么这些操作应放到谁身上呢?肯定是放到 \(i+1\) 上造福后人啊。
注意判断不需要操作的情况!
D(2300)
题意:给定一颗 \(n\) 个点的树,你每一次操作可以选择一条链上的一个点,将该点的所有非链上儿子及其子树往其链上父亲或链上儿子移动(就是断开原来的边,往移动到的点连边),直到最后形成一条链。你需要最小化这个过程中的操作次数,你只需要输出方案中的第一步即可。
首先,我们就不应该忽略第一步这个信息,因为这可以大大减轻我们的思维难度。
其次,我们思考:如果要最小化步数,那么原来选择的链的长度就要尽可能大——也就是树的直径。
然后,我们要考虑:一次操作至多可以增加链长多少?答案是 \(1\)。如果存在操作使得增长量大于 \(1\),那么直径一定没求对。
最后,怎么构造一次操作使得直径增长。我们只需要在直径上找到一个不止一个儿子的点,让它往它的非直径上儿子移动。
E(2300)
题意:有一个长度为 \(n\) 的数组 \(a\),满足 \(\forall_{i \in [1,n]}a_i \in [1,2]\),数组初始值未知。
你可以进行如下操作:
-
交换 \(a_x\) 和 \(a_{x+1}\);
-
从 \(i\) 出发,每一次移动到 \(i+a_i\);如果位置大于 \(n\),则结束。返回移动次数。
你可以进行至多 \(\lceil \frac{3n}{2} \rceil\) 操作,请还原数组 \(a\)。
有一个 Trick:先判可以判的,然后再判不能判的(这通常需要不能判的具有某种性质)。
我们令 \(d_i\) 表示从 \(i\) 出发的移动步数,然后分类讨论:
-
若 \(d_{i+1} \neq d_{i+2}\),那么 \(i\) 就可以判断(即若 \(d_i=d_{i+1}+1\),那么就有 \(a_i=1\),否则 \(a_i=2\))
-
若 \(d_{i+1}=d_{i+2}\),那么 \(i\) 就不能判断(因为 \(a_i=1\) 和 \(a_i=2\) 的结果一样,都是 \(d_i=d_{i+1}+1\)。好处是不用询问了。)
然后我们注意到不能判断的下标一定不连续(自行证明)。
这么判断一轮后,我们就来处理之前不能判的:
-
交换 \(i\) 和 \(i+1\);
-
再次询问 \(i+1\)。(等价于把 \(i+1\) 夺舍了,因为不能判断的下标不连续,所以 \(i+1\) 一定可以判断)
分析操作次数:能判断的用 \(1\) 次,不能判断的用 \(2\) 次。因为不能判断的下标不连续,一定不超上限。
F(?)
run 我真不会,另请高人吧。

浙公网安备 33010602011771号