2026 Codeforces Round 1081 (Div. 2)

(本题解按照题目难度排序,仅用作补题记录)

A - String Rotation Game

解题思路

观察得出,所有的操作都在进行循环位移,求一遍环形的答案即可

B - Flipping Binary String

解题思路

按照题意来理解,每次选中一个位置,除这个位置外的所有位置都翻转一次
如果 0 出现的次数为 num -- 奇数,那么所有的 0 位置选择一遍,所有的 0 的位置都反转 ( num - 1 ) (偶数) 次 不变 , 所有 1 的位置都反转 num 次 奇数次变0。
如果 1 出现的次数为 num -- 偶数,那么所有的 1 位置选择一遍,所有的 1 的位置都反转 ( num - 1 ) (奇数) 次 变 0 , 所有 0 的位置都反转 num 次 偶数次不变。
特判一下全 0 的结果就行

C - All-in-one Gun

解题思路

如果一轮弹夹需要打光,则置换顺序无意义,直接打光记录一下花费
如果 h 恰好在一轮弹夹打光为 0 ,则直接给出答案
否则 h = h % sum ,血量压到最后一轮的状态,我们只关心最后一轮的具体过程
由于子弹是按顺序击发,我们只能调整一次,置换两个子弹,也就是说,在某一段连续击发的状态下,用后面的最大伤害子弹,替换掉前面这个连续段中的最小伤害子弹 ( 也要有不换的考虑 ) ,如果此时的伤害和大于等于 h ,整个过程就直接结束。

D - Cost of Tree

解题思路

这道题的核心思路是树形动态规划。首先以节点1为根进行DFS,预处理出每个节点的深度dep、子树和sum、子树最大深度mdep,以及原始代价val(即子树中所有节点到当前节点的加权距离和)。然后进行第二次DFS自底向上计算答案ans:对于每个节点u,枚举它的每个孩子v,考虑两种操作:要么将v的整个子树移动到其他孩子的最深节点下(增益为sum[ v ] × 最大深度差),要么在v的子树内部进行一次操作(增益为ans[ v ] - val[ v ])。通过前缀/后缀最大值数组快速获取其他孩子的最大深度,从而在O(1)时间内得到每个孩子的最优选择,最终取最大值作为 ans[ u ] 。这样每个节点的答案都能高效计算。

E - Swap to Rearrange

解题思路

如果一个数字只存在了奇数次,则无法分配。
使用 Hierholzer 算法 DFS 递归 找到欧拉路径 即可

F - Fish Fight

解题思路

我不会啊,我看也看不懂啊,我是一条被吃掉的臭鱼