Solution Set - Codeforces Global Round 1~8
记号 | 含义 |
---|---|
🏃 | VP 参赛/现场赛 |
🚶 | 单纯做题 (一般是因为以前做过一些) |
* | 参考题解 |
^ | 以前做过 |
~ | (🏃 的场次) 赛后独立过掉 |
🔼 | 推荐场次 |
🔽 | 不推荐场次/屑题 |
⭐ | 不难但值得一看的的好题 |
✡️ | 神题 |
没做的大概率是懒得看了, 兔是这样的. (
Codeforces Global Round 1 🏃🔼
Remark.
个人体验来说, ABC 写得比较慢, 竞速赛还是打少了. 但是 E 的一眼盯真又让节奏莫名其妙加快, 再因为 F 不想写 导致没时间写 G 的讨论 (虽然补题的时候发现讨论仍有瑕疵).
除了 E, 题目质量不错, 推荐.
A. Parity
模拟即可.
B. Tape
用恰好 条不重合的胶带一定不劣. 选择最大的几个 不覆盖即可. 使用 std::nth_element
做到 .
C. Meaningless Operations
- 「C.性质/结论」
CF 风味诈骗题. 设 , 注意到 , 当 时, 取 , 答案达到上界 . 当 时怎么办呢… 这样的 只有二十来个, 打表预处理出答案即可. 不计本地打表时间的话, 复杂度自然是 的.
当然, 我们也可以再想想计算 的不那么暴力的方法: , 因此答案为 的最大非平凡因子, 这就很好算了.
D. Jongmah
- 「A.DP-序列 DP」「C.性质/结论」
按颜色装桶, 画出桶的直方图以获得一些直观结论. 注意到如果一个 的直方图区域被全部使用, 我们完全不用关心它是横着分成三组还是竖着分成三组. 竖着分是平凡的, 所以我们规定这样的区域被竖着分. 此时在我们的最终分组中, 对于同一个 , 不会出现超过两次, 则 被 后面的元素横向覆盖的次数不超过 次.
得到了这些常数的上界就能设计状态了, 令 表示处理了 , 剩下 个必须被后面的东西覆盖, 剩下 个必须被后面的东西覆盖, 直接转移就行. 复杂度 , 为一个关于转移次数的常数.
E. Magic Stones 🔽
超级无敌史诗级经典老番, 变换操作就是交换相邻两个差分值, 因此 能互相转化当且仅当 , 且 . 复杂度 , 来自离散化或者 std::map
.
F. Nearest Leaf ⭐
- 「A.数据结构-线段树」「B.离线」「C.思维」
一眼盯了一百个 的做法, 因为赌气不想写, 又想了一大会儿.
分析被卡住的原因: 像给出区间 这样的询问, 如果尝试离线, 太容易先入为主地去按照区间端点离线. 而这题恰恰利用特殊的结点编号形式, 按询问的 离线. 得到这个离线思路之后就没有障碍了.
具体来说, 我们将询问按照 离线, 在树上 DFS 枚举结点, 同时维护所有叶子当到前结点 的距离. 当从 经由边权为 的边走向儿子 时, 子树内的所有距离 , 其余所有距离 , 从 回溯时则相反. 查询则需要求出一段区间内距离的最小值. 线段树维护这一过程, 可以做到 .
Remark.
清新的数据结构, 去套路化的思考要求, 挺不错的题. 按 离线的 motivation 是关键.
G. Tree-Tac-Toe *⭐
- 「C.性质/结论」
题不难, 描述结论真的麻烦. 这题要求我们进行目的明确的分讨并简洁地描述结论.
首先是对已经被染白的结点的转化. 已有的白点可以制造先手, 那么构造一个先手局面就能表示白点. 具体地, 对于白点 , 加入新点 , 连接 . 经过先后手的分析可以发现先手直接染 一定不劣, 且一定不可能利用 产生原来没有的局面, 因此这样的构造等价于 为白色.
到此, 我们只需要分析无色的树了.
-
结论一: 若存在 , 则白胜.
-
结论二: 若存在 , 且 的邻接点中有至少两个非叶结点, 则白胜.
证明都是显然的. 此时我们只剩下一种不平凡的情况:

设 为左右两端的三度点, 则链上所有到 的距离为奇数的点都是先手, 且对方仅能在左侧染色应对; 到 的距离为奇数的点也是先手, 且对方仅能在右侧染色应对. 因此当且仅当 为偶数时先手必胜. 其余情况必然平局. 复杂度 .
Remark.
先构造性地转化 "已有白色", 从而大大简化讨论, 第一步的 motivation 值得留意.
Codeforces Global Round 2 🚶
Remark.
如果赛上切 A~F 的话, 似乎并没有什么很好玩的题. G 和 H 可以补一补, 不太推荐 VP.
A. Ilya and a Colorful Walk
如果左右同色, 答案一定产生于到左端或者右端; 如果左右异色, 答案是 . .
B. Alyona and a Narrow Fridge
顺序枚举 , 最有策略显然是排序后从大到小两两分组, 如果有单就单出最小的. 最粗糙的 也能过.
C. Ramesses and Corner Inversion
一贯从 "可行操作张成的向量空间" 理解这类题. 注意到 的操作在行上叠加, 可以得到同两行上的两个 , 再将这两个 在列上叠加, 可以得到任意矩形的四个角, 而这正是我们的可行操作. 因此, 可行操作张成的向量空间就是所有 的操作张成的空间. 也即是, 原规则下有解, 等价于仅使用 操作有解. 直接模拟一编就行. .
D. Frets On Fire
对于给定 , 第 条弦内出现的数为 . 暴力处理询问的话, 我们自然会选择将区间按照左端点排序. 事实上这一顺序是恒定的, 我们可以先排出来. 称 为排序后两根弦 和 之间的 gap, 显然当 不超过 gap 时, 两条线段的贡献独立; 当 超过 gap, 两条线段中间全部被覆盖, 贡献就与 无关了. 贡献形式是一个分段函数. 因此我们再按照 gap 排序, 询问时二分出恰好未被 bridge 的 gap 的位置, 算算前后的贡献就做完了. 复杂度 .
E. Pavel and Triangles
- 「B.贪心」
差点看成上一场的 D 了. (
显然, 三角形的边长的形式必然是 . 如果 配对是一定的, 即, 对于每个 , 我们知道有多少对 组成了最终方案中的三角形, 那么 之间就是一个简单的括号贪心匹配.
接下来的贪心也是自然的: 我们先将所有 全部配对, 从后到前扫描一遍以求出所有必然失配的 . 此后, 再将剩下的 拆开. 拆开的过程肯定是拆开小的 , 和两个大的 分别匹配. 这部分损失是 的. 总之就是 贪心一遍结束.
F. Niyaz and Small Degrees ^
G. Get Ready for the Battle ^
- 「A.构造」
观察样例, 猜测答案能取到下界 . 这为我们的构造指明了目标. 为了不造成浪费, 我们关注所有 的值. 发现取 排序后的差分为分组方案, 循环填数, 就能达到最优.
兔也不知道当时怎么想的, 所以很 unmotivated. 复杂度 .
H. Triple ⭐
- 「A.数学-生成函数」「A.数学-FWT」
看着挺有意思的 (因为是数数题), 来玩一玩.
令原条件中的 分别为 , 令集合幂级数 , 答案则为
其中乘法为异或卷积. 当然, 这肯定是需要引入 FWT 的. 令 为左右项 FWT 后的结果, 则
又当然, 这个 没办法直接求, 我们需要手动变换. 由于
是 的线性组合, 且仅有 种, 我们可以尝试计数每一种组合的出现次数. 另一方面, 通过令 , 可以固定 的系数恒为 以减少讨论.
到此, 对于每个 , 我们需要求出
当 固定时, 要求的则是 . 每个 中都带有两个真值表达式, 并不好算. 但是如 的线性组合却能完美避免这个问题. 令 , 同理, , 那么可以列出线性方程组:
最后一个等式的构造相对较麻烦, 如果先猜想这种形式再去找组合意义可能会快一点.
肯定有家伙懒得解方程吧! 还是把解列一下:
挺好看的. 利用方程解出 , 算出 再逆变换回去就行. 复杂度 . 引入更多的元, 形式化罗列和解方程也是可以做到的, 不过这道题已经被加强过了.
Codeforces Global Round 3 🏃🔼
Remark.
__builtin_parity
/__builtin_parityll
, 你们他妈赶快滚进标准库重载成一个东西.
A. Another One Bites The Dust
答案是 .
B. Born This Way
你好, 兔这题就做复杂了. 这里就只提正解吧.
Arkady 的策略是显然的: 找到最小的可用 , 然后找到最小满足 的 , 在 时刻到达 C 地. 那直接枚举我们保留下的最小 , 从第一个可用 开始往后删直到删满 个, 对当前答案取最大值即可. 双指针做到 .
C. Crazy Diamond
- 「A.构造」
注意到一个位置 一定能跳到的位置只有 或者 . 于是我们保留这两个位置, 先让 归位. 枚举 , 先让 跳到 或 , 如果不能直接跳到 就跳到另一端再向 跳. 归位后, 检查一下是否需要交换 . 最劣情况使用 次交换.
D. Dirty Deeds Done Dirt Cheap
- 「A.构造」
你好, 兔又做复杂了. 这里就只提正解吧.
显然 的数对不能和 的数对交叉贡献. 仅考虑 的情况, 惊讶地发现按 降序排列就满足条件了. .
兔写的线段树维护贪心.
E. Earth Wind and Fire
- 「B.贪心」
注意到操作可以不改变石头间的相对顺序, 所以将 排序后, 我们可以钦定 被移动到 . 这时, 若有 , 的石头和 的石头可以相互拉进靠近自己的目标点. 于是按顺序扫描, 像括号匹配一样贪心地拉进就行了. 复杂度为排序的 .
F. Foo Fighters ~
- 「A.构造」
不妨设原来所有 之和 . 虽然所有 bit 的地位是相同, 我们还是可以尝试插一棵 Trie 树辅助思考. 对于 子树, 设其左右儿子的贡献已经确定为 , 我们可以通过 对应的 bit 得到 或者 . 那如果说 , 我们就高枕无忧了.
如何找到这样一个 呢? 注意到没有 , 而所有 之和 , 所以从根到最左结点的路径上, 一定存在一个结点仅有和 的右子树, 相当于找到了 , 调整这个位置的 bit 使之贡献 , 一路回溯回去不会使贡献增大, 这样就构造出答案了.
实现的时候排个序就行, 复杂度是排序的 .
注意 __builtin_parity(unsigned int)
, __builtin_parityll(unsigned long long)
. 心态整炸了.
Codeforces Global Round 4 🏃
Remark.
可能是信心场, 可以找状态的时候做.
A. Prime Minister 🔽🔽🔽
EI 读了六分钟题, 兔只读了五分钟, 兔看不起英语不好的人. (
题意: 问所有不超过 一半的 加起来再加上 , 是否超过所有数总和的一半.
这 A 题怕是整场比赛阅读量最大的. 😠
B. WOW Factor
对于每个 o
, 求其前面的 vv
数乘上后面的 vv
数. .
C. Tiles
左上角 种方案, 其余第一行或者第一列上的 种方案, 此后其他格子被唯一确定. 因此答案是 . .
D. Prime Graph
猜测当 内有素数, 先连一个环, 然后加边把一些点的度数变成 , 直到总边数为素数即可. . 范围内的 可以很快枚举验证, 但一般情况兔完全不会证明 qwq.
E. Archaeology
左右双指针向内扫, 相邻不等的性质保证我们一定能选出足够数量的配对. .
F. Short/Long Colorful Strip
- 「A.DP-计数 DP」「A.DP-区间 DP」
F2 并不困难, 兔并没有思考 F1 的特殊解法, 就不分开讲了.
我们定义一个区间 是完备的, 当且仅当出现在 中的颜色仅出现在 中. 设当前考虑的完备区间为 , 被染成当前颜色的位置为 . 那么, 我们要求 是完备段, 递归进去算贡献. 难点在于对 和 这段区间是否被当前颜色染的讨论.
注意到这样一个事实: 当某个时刻 , 则该时刻之后都必然有 . 因此, 设我们实际染色区间为 , 则 , , , 都需要是完备区间. 当完备区间的一个端点固定时, 另一个端点仅有 个可能位置. 完备区间总数当然也是 的, 因此直接记忆化搜索求出完备区间 的答案即可. 注意无解判定, 复杂度 .
G. The Awesomest Vertex ~⭐
- 「A.分块」「A.数据结构-线段树」「B.Tricks」
看着榜上一大堆和兔一样一小时前六道然后调不出 G 的人, 兔就放心了. (
绝对值? 绝对不能带着绝对值! 注意 , 而我们要求的是 , 一开始就维护好 和 就没有绝对值了.
法一 在 DFN 上转化后, 我们需要处理的问题是: 区间 , 区间询问 . 分块+单调队列维护凸包可以简单 . (你说得对, 但是真的难调, 分块都好难调啊!)
法二⭐ 考虑直接用线段树维护直线 . 由于 单增, 所以区间内最大值的取值点单调向右移动, 有意义的移动不超过 次 (直线交点数量). 虽然凸包本身没办法合并, 但最有答案和最近的有意义移动点是可以简单记录的. 势能分析可以得到 的复杂度, 兔没有细看证明 qwq. 可以参考这里. UPD: 这个很像 KTT?
Codeforces Global Round 6 🏃
A. Competitive Programmer
各位数字之和为 的倍数, 拿一个后导 后还有偶数位.
B. Dice Tower
一个骰子的相对两面之和恒为 , 由此只有最上面一个骰子的方向需要被考虑.
C. Diverse Matrix
观察样例, 猜测最小 magnitude 为 , 于是我们需要将 安排为每行每列的 . 设行列 为 , 尝试令 . 当 , 可以让所有列的 一定合法, 反之亦然; 当 , 也可以让所有列的 一定合法, 反之亦然. 那么构造就很简单了. .
D. Decreasing Debts
只要每个人应得的总钱数一定, 方案就合法. 求出这一数值, 随便匹配欠债关系即可. .
E. Spaceship Solitaire
设 , 则答案有下界 . 可以证明下界可取, 当然作为 competitor 的兔可以不证明. (
F. Almost Same Distance 🔽
- 「C.性质/结论」「C.细节」
这个 🔽 仅用于表达兔对细节题的讨厌.
当 一定时, 合法点集一定为存在一个或两个相邻花蕊的, 花瓣很长的菊花. 枚举花蕊, 记录好子树深度后可以求答案. 同时注意到 , 所以可以取远端更新然后继承答案. 精细扫描线可以做到 .
妈的当时不想写题解, 现在也不想写.
Codeforces Global Round 7 🏃🔼
Remark.
这场挺创人的. E 和 F1, F2 挺好玩儿, D 可能写着比较烦人 (指在 VP 状态下写细节讨论).
A. Bad Ugly Numbers
填最低位, 其余位用 来调整模 余数. .
B. Maximums 🔽
按题意模拟, . 您这题放哪个水平都不 educational 吧.
C. Permutation Partitions
产生最大值贡献的一定是前 大, 找到它们的位置, 中间的分隔点随意移动, 乘法原理算方案即可. .
D. Prefix-Suffix Palindrome
去除已经回文的前后缀, 求 和 的 border 决策剩下的回文. KMP 做到 .
E. Bombs
答案不增, 立马把问题转化成判断预期答案 是否可行. 活下来的条件是: 存在一个 , 使得 后面 的数严格多余 后面的炸弹数. 线段树维护差值最小值即可. .
F1. Wise Men (Easy Version)
- 「A.DP-状压/插头 DP」「B.Meet in Middle」
一个很勉强的 meet in middle 做法. 我们暴力 DP 时, 需要记录已选人的集合状态和当前字符串的状态, 肯定不行. 但注意字符串对转移形式没有任何影响, 所以可以 meet in middle: 只求出所有 个人的集合产生的字符串状态, 然后两半拼起来算方案数. 这样减轻了对字符串状态的记录压力, 复杂度毛估为 , 其实也就在暴力基础上除了个 .
F2. Wise Men (Hard Version) *✡️
- 「A.数学-FWT」「B.Tricks」「C.思维」
, 多个 同理. 这是子集卷积的原理, 但也是一个巧妙的转化 "不交" 的技巧.
F1 中, 我们利用 "字符串对转移形式无影响" 的性质完成了 meet in middle, 而这种 "无影响" 还能更深入的挖掘 — 将 "构造字符串" 分拆为多个几乎独立的计数情景.
具体地, 我们枚举字符 的连续段 (也可以是空段, 对应单个人), 将它们有序地排列到 个位置上. 不同段间可能仍然有 , 只需要简单子集容斥一下.
如何安排序列呢? 首先可以 DP 出将集合 串成全 路径的方案数. 枚举 的整数拆分, 求出满足条件的子集组合方式, 最终就能得到每种整数拆分对应的方案数. 然后枚举最终答案字符串, 找到其极大连 段划分对应的方案数, 对这一组方案数子集容斥, 就能得到答案. 复杂度 .
Remark.
这种完全跳出 DP 灵活地使用已知技巧计数的东西好酷. (
Codeforces Global Round 8 🏃
Remark.
狙击场, 任何系列赛事都是越出越难是吧 qwq.
A. C+=
能一步变成 或者 , 你说你应该选哪种呢?
B. Codeforces Subsequences
均匀的一堆 , 一堆 , 一堆 , …, 一堆 , 这样肯定最省长度. 目测一下也不会构造出意料之外的子序列. 那么就 结束了.
C. Even Picture
兔在《world.construct(me);》加强了这道题.
D. AND, OR and square sum
注意到 恒定, 而一次操作可以将 bit "富集" 向其中一个数, 这正是最大化平方和所期望的. 因此, 把每个 bit 尽量向前集中就能得到最优的 .
E. Ski Accidents
- 「A.构造」
, 尝试把中转点分为 三组, 满足 , 此时扔掉 就非常合适了.
在二叉树结构上的 更像是三染色. 染色可得:
-
: 入边 (若存在) 都来自 .
-
: 入边存在且都来自 .
-
: 存在入边来自 .
正确性不难证明. 复杂度 .
F. Lamps on a Circle
- 「A.构造」「C.非传统-交互题」
直接考虑收敛到的状态. 在 Bob 操作之前, 肯定不存在一个长于 的亮灯连续段, 否则 Alice 的操作就无效了. 在这种情况下, 最优的可能状态为 , 不过需要令最后一位为 . 计算此时 的数量为 , Bob 跟上操作后剩下 , 所以可以在 附近找到最优的 . 交互时一直用这个 来构造目标序列即可.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-03-02 Solution -「HDU #6566」The Hanged Man