T1 只因数分解
题意:给出 组 ,对于每组 你都需要找出一种把 分成不超过 个数的方案,每个数都是 约数。
这个东西居然被我乱搞搞过去了……考场做法是每次找一个 ,枚举 , 时就令 ,然后 。
理论复杂度为 ,会超时,然后……其他人用这个全 ,由于我的代码过短 了……。
官方正解是 的:考虑阶乘进位制,即考虑拆解 ,其中 ,那么每一位处理一次就行。
但有可能存在 的情况,此时 不一定是 的约数。考虑把位权反过来,即第 位的位权从 变为 ,此时有 ,即可解决。
这种方法也间接证明了我的乱搞是正确的。
T2 宇宙射线
搬题链接:P9378 物理实验
题意:一共有 个实验,你每次可以任意选择一个还没做并且没有被破坏的实验来做实验。有 轮宇宙射线,第 轮在做完 个实验后出现,并且有一个 排列 。第 轮宇宙射线会破坏第 个实验,满足:
-
实验 要么做过,要么被破坏过
-
实验 没做过也没破坏过
显然你可以做 个实验。做第 个实验的收益为 ,求一种做实验顺序方案使得总收益最大。
经典套路,枚举 ,当前能选第 个实验就选,因为如果不选,后面实验全做的收益也没有 多。
问题变成判断一个做的实验集合 是否合法。枚举每个射线,然后维护 表示当前至少需要做 个 中的实验。
时间复杂度 。
T3 崩原之战Ⅱ
题意:有 个区间,第 个区间 的种类为 ,选择若干个区间,使得种类不同的区间无交集,求选择方案数。
实用价值高!但就是原题面漏洞百出……
先把所有区间从小到大排序。
设 表示考虑了区间 且区间 必须选择的方案数。
不能在包含关系之间转移,这样会使得转移条件混乱。考虑第 个区间和前面选择的几个同种类的区间构成的 同种类区间连续段。为了构建这个结构,求出 表示满足 的最大的 ,枚举选择的上一个不同种类的区间 ,用 表示不存在这样的区间,转移:
其中 表示前 个区间中, 且 的区间 的个数,在转移方程中的意义为 之后 之前的与 同种类区间任意选。
设 表示
那么
注意到 容易转移:
放到 有:
把 看做常量,我们对于 开两棵线段树,保存 。
于是我们只需要对线段树
时间复杂度 。
T4 跳水运动员
题意:给出一棵 个点的树,把 分若干段,每一段映射在树上是一个连通块,求分别分成 段的方案数。
对我们有很大启示,先思考如何做 ,即 的情况。
一个段合法,当且仅当这个段至多有一个 满足 不处于段内,想象一下放在树上,正确性显然。
设 表示把 分 段的方案数。 时,如果我们枚举 计算 ,那么很难这个段是否合法。考虑倒着做,设 表示把 分 段的方案数,枚举 ,那么 中至多一个点的父亲 (在 中,这样的点显然只有 )。找出最小的 满足 ,最小的 满足 ,那么决策 。如何查找?我们可以用一个 ,扫到 时把 加入集合,在 的位置挂上删除 的标记。
进一步思考如何做 。当 可以小于 也可以大于 时,我们仍然正着枚举,设 表示把 分 段的方案数。对于 的点,我们仍然像 的做法,找出最大的 满足 、最大的 满足 。对于 ,段 存在点 满足 不在 内,那么这个段内就不能有父亲 的点。
把 看做常量,维护 表示 内有多少个点的父亲 ,显然我们只关注 的 。当 时,不能有 的点,即统计有多少个 满足 ;当 时,允许有至多 个点 ,即统计有多少个 满足 。
维护集合 表示 的 集合, 表示 的 集合。当遇到一个 的点,对于 ,,即把 中 的数删除,把 中 的数移到 。
每个数至多添加一次、移动一次、删除一次,因此集合操作均摊复杂度正确。每次查找一个 的数为 ,总时间复杂度 。
考虑 ,发现 和 没有一点关系,尝试把两者分离,但是推一推发现分离需要手写平衡树……
我们需要另一种写法,发现每次添加的都是最大值,移动都是移动集合中从小到大排序后的一段后缀,删除也是一段后缀,我们不需要 维护,只需要两个数组,维护这两个数组的前缀和,二分查找位置即可做到 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话