1 条题解
-
0
自动搬运
来自洛谷,原作者为

nullqtr_pwp
我注意到有些人一直在做各种地方的cnoi题,但是并没有什么b用,可能是因为一直在舒适区里面舒服的卷,虐杀自己擅长的东西并获得成就感。搬运于
2025-08-24 22:44:19,当前版本为作者最后更新于2024-04-26 22:41:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
省流:披着个构造皮子的 dp 题。
讲课讲了这题,感觉很厉害啊。
注意到 的点对 可以改写成一张有向图上 的边,考虑把这张图建出来。那么 的意思就是存在一条路径,使得 到 经过不超过 条边。现在我们就是要构造这张有向图上的非平凡边( 都是给出的)。
评分标准告诉我们存在一种方案,。。大概边数要做到 ,这其实很困难,但这引导我们去往最小化边数去思考。
怎么做?
显然就是分治:对于每个 , 都向 连边, 都向 连边。分治解决 即可。这样的边数恰好满足 。
怎么做?
注意到 是个很厉害的性质,然而只找一个有点亏,依旧考虑当前区间 ,我们可以找两个关键点 ,使得区间被划分为 。我们考虑 都往相邻的区间中的所有点都连边,并且连接边 ,这样可以得到比猫树分治做法更优的解。
注意到这个关键点可以选不止一个,其实可以选任意 个,设为 ,此时被分割成的若干段区间内部都满足相同子结构性质。也就是说, 的区间的划分是递归进行的,相同子结构的问题(定义 )
注意到要保证两两能跳到,因此 这些关键点之间两两都必须有边,此时会多产生 的代价。
怎么做?
注意到关键点之间两两需要保证在 步之内可以互相抵达,这同样可以被归类为一个长度为 , 的子结构。
算法设计
上面一车东西都是「在 个点的图中, 时最少需要添加多少条边」的子结构,直接把这个写成 dp,记为 。
转移按照 从小往大进行,每次枚举一个长度 ,然后枚举关键点个数 。
考虑关键点内部怎么划分。注意到我们要求中间划分出来的段尽量均摊,调整法理解一下就会发现这是对的,但是两边与中间的贡献是不平衡的,我们只能保证两边选出来的数量尽量一致,不能去考虑与中间的一致,之前在这里卡了半天。
因此考虑一个「辅助情况」:两边都划分为 个,直接钦定 ,中间直接被划分为 段。此时可以刻画出来每一段的长度,就是直接均摊。继承子结构的贡献之后,然后加上这一层关键点对两边区间的新边,以及关键点之间的边的数量。
然后你发现,枚举两边的点的个数相等为 时,减去两侧的点之后,就是一个规模为 的「辅助情况」的解。
这样容易将一层的 dp 做到 ,总共 dp 的复杂度就是 。
构造方案?直接由最后的 dp 值倒序进行整个 dp 过程,找到每个 dp 值是从哪里来的,输出每一次产生的新的贡献的边即可。
- 1
信息
- ID
- 7782
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者