Solution Set - “说选个晴日,露能滴出彩虹”
- 0.「BZOJ #3457」Ring
- 1.「CF 1824C」LuoTianyi and XOR-Tree
- 2.「CF 1824D」LuoTianyi and the Function
- 3.「CF 1728F」Fishermen
- 4.「CF 1305H」Kuroni the Private Tutor ⭐
- 5.「十二省联考 2019」「洛谷 P5291」希望 ⭐
- 6.「IOI 2007」「洛谷 P4649」训练路径
- 7.「BJOI 2018」「洛谷 P4429」染色 ⭐
- 8.「AHOI/HNOI 2017」「洛谷 P3725」队长快跑
- 9.「LOJ #6261」一个人的高三楼
- 10.「CF 1408I」Bitwise Magic ⭐
- 11.「NOI Simu.」图腾
- 12.「NOI Simu.」糖果 ⭐
- 13.「ARC 160A」Reverse and Count
- 14.「ARC 160B」Triple Pair
- 15.「ARC 160C」Power Up
0.「BZOJ #3457」Ring
-
「A.数学-Pólya 计数」「B.向量-矩阵优化」
Pólya 不如 Burnside, 在初等的题目上相信这一点. (
Burnside 嘛, 设当前枚举的循环节长度为 , 关键问题在于算出有多少个长度为 的串, 其循环同构串中 作为子串出现过. 对循环节增量枚举的过程显然是 的匹配自动机上结点的线性变换, 用矩阵快速幂计算即可. 注意这里需要钦定末尾的匹配状态, 转完一圈后再用的确达到这个状态的方案贡献答案. 为了避免增大矩阵大小, 可以容斥算非法方案. 不过复杂度都是 的.
1.「CF 1824C」LuoTianyi and XOR-Tree
- Link & Submission.
显然, 树合法的必要条件是对于每个 , 到子树内叶子的距离相等. 注意若我们在处理 子树外的结点时, 对 内的距离提出了某种要求, 我们至少可以通过修改 在一步额外操作内满足要求. 因此, 我们只需要保留最小化 子树内的代价的决策, 其余的决策都不如在被保留的决策基础上直接修改 来得快.
于是, 子树的信息就是一个可选的最优距离集合 . 合并子树时, 就是将所有集合合并, 取出出现次数最多的元素组成新的集合. 这一过程可以用 Trie 或者启发式合并维护, 但都难以避免麻烦的时间戳标记. 一个好写的算法是: 用 map 维护, 启发式合并 后, 若最大出现次数 , 则暴力扫描 删除所有不需要的元素. 这样好写不少, 只扫描被合并入大集合的元素也能保证 的复杂度.
2.「CF 1824D」LuoTianyi and the Function
- Link & Submission.
没题出可以咬打火机喵~
对右端点扫描线, 线段树维护历史和就行. 维护 矩阵中的 个位置, 稍微写精细一点就稳过了. 复杂度 .
3.「CF 1728F」Fishermen
- Link & Submission.
- 「A.图论-网络流-费用流」「B.Tricks」
有一个显然但 的费用流大暴力, 我们可以尝试模拟费用流.

例如, 我们从大到小加入元素对应的点, 那么就有两种可能的负环: , 以及 . 后面这种环可以通过顺序加入 而非 规避掉, 此时暴力用匈牙利增广前面一种环即可. 复杂度 .
4.「CF 1305H」Kuroni the Private Tutor ⭐
- Link & Submission.
- 「A.图论-网络流-最大流/最小割」「B.贪心」「C.性质/结论」「C.思维」
假设已知 , 如何判断分数安排的合法性呢? 虽然可能有些浪费, 但流网络显然能够很好地描述 "把分数分配给学生" 的情景. 我们可以给出这样的流网络:
若 存在从 到 , 流量为 的可行流, 那么安排方案就合法. 而显然 , 所以这也可以描述为 , 即所有 上的割至少为 .
先考虑上界, 设割集为 , 那么:
显然, 为了取出最小化的割来缩紧限制, 我们可以令 , 降序排列, 那么:
考虑下界, 类似于上下界网络流的一贯手法, 我们研究提供下界流量的 , 它的所有出边全部满流, 于是 不属于同一个割. 则当 , 时:
当 , 时:
后者是第一个式子的必要, 就不用考虑了. 前者也可以通过排序权值化简. 最终得到判据
右式和 无关, 而左侧 已经单调, 因此枚举 时, 的移动也是单调的, 借此可以快速判定.
接下来, 显然并列人数可二分, 设并列人数为 , 我们需要贪心地安排一个 "最容易合法" 的 , 根据判据, 我们就需要让 的后缀尽量大, 也就是尽可能平均. 从后往前扫每段有上界的区间, 不断让它们整体增加即可. 前 的值也可以二分地钦定. 这样一次检查是线性的, 最终复杂度 .
5.「十二省联考 2019」「洛谷 P5291」希望 ⭐
- Link & Submission.
- 「A.树论-长链剖分」「B.Tricks」
也不能说很难想吧… 反正代码是贺的 (骄傲.jpg).
我们希望枚举目标发动机 , 然后再来计算可行的集合方案, 但这样会算重. 不过, 当集合方案一定时, 可行的 点一定构成连通块, 于是我们可以通过 "连通块数 (合法集合方案数)" = "点数 (对于 点合法的方案数)" - "边数 (对于两个端点都合法的方案数)" 来完成容斥.
接下来就是树 DP 嘛. 令 表示仅考虑 子树内的点, 组成到 距离不超过 的连通块数量 (含空集), 表示仅考虑 子树外的点, 组成到 距离不超过 的连通块数量 (含空集), 设 是 的父亲, 那么
这个 倒是可以长剖求, 不过也需要很痛苦的乘法和加法标记维护. 对于 , 这个 的上界是子树外最远距离, 可以用类似 "反向长剖" 的方式得到维护思路: 从父亲向重儿子遗传信息, 每次指针向前移动而非正常长剖的向后移动. 注意这里内存池理论上只需要维护距离的一段后缀, 也和正常长剖有所区别. 对于 , 我们可以在求 的时候维护乘积前缀, 同时将对 对 的所有更新全部撤销, 这样就规避了持久化数据结构. 线性求逆元可以做到线性, 当然这里放一个 也是能过的.
6.「IOI 2007」「洛谷 P4649」训练路径
- Link & Submission.
- 「A.DP-树上 DP」「C.性质/结论」
终于能做道紫题了…
我们可以容忍奇环的存在, 但注意到若两个奇环边有交, 则一定可以生成一个非法的偶环. 所以, 最后得到的图一定是一个不包含偶环的仙人掌.
考虑树 DP, 在 LCA 处决策非树边的贡献. 设 表示仅考虑 子树内部的点和边, 最多能保留的非树边边权和, 特别地, 因为我们在加入 LCA 时要求路径上的边不被其他非树边跨过, 我们还需要处理 , 表示 子树除去 子树后, 其余部分的贡献. 到此, 非树边 的贡献就可以描述为
其中 即爬树过程中的上一个结点. 参与贡献时, 还需要保证爬到的至多两个 的儿子不被其他非树边占据, 因此在 处还需要记录集合状态 来辅助转移. 其他的小细节就不提啦, 复杂度 , 其中已知有 .
7.「BJOI 2018」「洛谷 P4429」染色 ⭐
- Link & Submission.
- 「C.性质/结论」
第一眼: 奇环无解.
第二眼: 若一个换上的点颜色被强制确定, 可以构造方案让环非法. 也就是说, 有能力钦定环上一个点的颜色. 所以若存在两个边不交环就无解.
此外, 一个环显然有解. 所以我们需要研究的还剩下两个相交环的情况. 此时, 在拓扑去掉树状分枝后, 图一定长成这样:

我们关注唯二的三度点. 这样的图并非一定合法, 例如说:

和环上 "钦定值" 的构造类似, 我们用路径 描述 " 与 同色", 用 描述 " 若选 , 只能选 ", 用 描述 " 若选 , 只能选 ", 后两条路径组合出 " 与 异色", 矛盾就产生了.
这样的构造在含有至少两条长度至少为 的链时都奏效, 其余的小情况可以手玩. 最后我们得到结论: 两个三度点需要同时邻接至少两个点才有解.
In conclusion, 一个图有解, 当且仅当其是二分图; 拓扑消除树结构后, 每个连通块中不存在两个以上的环或者存在恰好两个环, 且两个环的三度点同时邻接至少两个点. 后面这句复杂的话还能简化成: 不存在度数 的点, 至多存在两个度数 且它们同时邻接至少两个点. 随便判判就行, .
8.「AHOI/HNOI 2017」「洛谷 P3725」队长快跑
- Link & Submission.
- 「A.计算几何」「C.性质/结论」
显然我们仅会经过起点, 终点和机关的发射点. 不过欧式距离看上去就不可维护, 的点数也几乎没法优化建图, 所以这里一定得有结论!
首先, 我们其实不太关心射线的具体方向, 因为保证有解, 我们只需要知道能不能从一个发射点的下方/上方走到终点. 在一定讨论后, 所有射线都可以转化到竖直方向.
接下来, 我们先来考虑只有一种方向的射线的情况, 如图 (是薅的, 下同):
若只有向上的射线, 我们的行走路径一定是一个下凸壳. 同理, 若只有向下的射线, 我们的行走路径一定是一个上凸壳.
然后, 考虑不同方向的射线的相互影响, 如图:
其中 是当前已确定路径的端点, 注意 被 截断, 那么此时 一定被当前最左侧向下的射线 截断. 此时清空同向凸包, 保留反方向凸包上的第一个能连接 的点加入同向凸包即可. 感性是优秀的. (哭哭
复杂度 , 瓶颈是排序.
9.「LOJ #6261」一个人的高三楼
- Link & Submission.
萌萌题乱入是怎么回事… 算 就行, .
10.「CF 1408I」Bitwise Magic ⭐
- Link & Submission.
- 「A.数学-FWT」「B.Tricks」
不难得到:
其中 在 维加法卷积, 在 维异或卷积. 这里应该是比较初等的.
接下来我们需要计算这个卷积结果. 因为 , 加法卷积部分也没什么可观的大优化, 所以核心自然是处理异或卷积的部分. 第一个观察自然是每个 的项数都很小, FWT 可以手动进行, 但 FWT 得到的向量一共都有 个多项式, 我们还得把它们乘乘加加, 这怎么可能?
因此, 这里的 key motivation 是, 我们猜测这个问题严格弱于对稀疏多项式的卷积. 弱在哪里? 的指数是连续的!
连续的自然数, 它们的高位几乎都是相同的, 如果我们把 按照 归类, 则 相同的一类中的卷积实际上只需要做 上的卷积, 更高的位一定是所有数直接异或出来的结果. 卷积部分, 我们沿用稀疏多项式的做法, 手动 FWT 然后对 维做暴力加法卷积, 卷完之后就剩下 个向量, 我们再把每个向量扩充到 , 全部卷起来, 最后 IFWT 一次就能得到答案.
个向量的暴力卷积复杂度是 , 前面手动 FWT 运算次数打表出来最坏是 量级. 本地极限数据 , 这… 兔的常数也太小了.
嘛, 其实正解做法和这个也差不多, 把多项式指数 全部换成 , 这样本质不同的 约有 个, 每一类单独处理然后快速幂乘起来就行. 其实复杂度算出来也没优秀多少是不是. (
11.「NOI Simu.」图腾
不难发现相邻两个点只有一维坐标相差 , 又因为起点坐标全是偶数, 所以每次只能将一个偶数 得到下一个坐标. 可能的后继方案形成了一个 DAG, 建虚点求它的最小割即可. 复杂度 , 因为答案不超过 所以有上界 .
12.「NOI Simu.」糖果 ⭐
- Private link | 口胡力!
- 「A.构造」
首先, 由于总和的奇偶性不变, 所以 时无解. 如果以过题为目的, 下一步应当是思考答案下界. 因为一个连通块中我们一定是操作出一个树形结构, 所以总操作次数不少于 连通块个数. 同时, 最多只有一个单点连通块, 且不存在大小为 的连通块, 所以至多 个连通块, 进而操作次数至少为 .
有目标了, 来构造叭!
第一个 motivation: 我们可以找一些优秀的 pattern. 对于一列 , 我们可以用两次操作将它们变为三个 ; 对于一列 , 我们可以用三次操作将它们变为任意的同一个数 (这也对应部分分的构造). 如果我们可以将 划分入这样的三元组, 使得每组的 都相同 (最多单出一个 ), 剩下一些常数部分用四元组扫尾, 就完成构造了.
抄抄题解.
-
, :
-
: 在 的基础上, 最后一组替换为 , 单列.
-
: 在 的基础上, 用四元组处理最后四个数.
-
: 在 的基础上, 用四元组处理最后四个数.
-
, :
-
: 在 的基础上, 用四元组处理最后四个数.
-
: 在 的基础上, 用四元组处理最后四个数.
-
, :
-
: 在 的基础上, 用四元组处理最后四个数.
怎么会有题解只字不提构造思路呢? 真是奇怪.
13.「ARC 160A」Reverse and Count
- Link & Submission.
写题解之前, 诚邀您看看一个叫 Rainybunny 的兔子这场比赛的 status. 过题数和 performance 的吐槽在如此励志的比赛历程面前都显得苍白无力. (癫
枚举 与 的 LCP, 字典序小于 和字典序不大 的数量都可以直接算, 那么就能判断当前 LCP 对不对. 注意你甜美的 corner 吧! 精细实现可以 .
14.「ARC 160B」Triple Pair
- Link & Submission.
整除分块 .
15.「ARC 160C」Power Up
设 表示考虑了原先 的数, 剩下 个 的方案数. 每次 的上限变化是 , 最终可用的状态数是 的. 转移可以滚后缀和, 总复杂度 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现