ABC267题解
给定一张 个点 条边的无向图,点 有一个点权 。
接下来你要在这张图上进行 次操作,每次操作选择一个没有被选择过的点,删除该点以及所有和该点相连的边,定义删除该点的代价为所有与它直接相连的点的权值和。
接下来,你需要求出一个最小的阈值,使得每次操作的花费不得超过该阈值。
很容易想到二分答案。
每次判断的方式也相当简单,设二分出的阈值为 ,由于每个点的花费只会随着操作的进行而减小,所以只要一个点的花费小于阈值,就将其丢进队列,如果凭借这种方式能够遍历全图,则证明该阈值下,能够完成操作。
给定一个 个点的树,定义两点间的距离为两点最短路径经过边的数量。
给定 个询问,每个询问给定两个值 和 ,询问树上是否存在与点 距离为 的点,若存在,输出任意一个,否则输出 。
显然,对于每一个询问,我们需要找到距离 最远的点,则所有不为 的答案都可以在其上找到。
不难想到处理出这棵树的直径,找到直径之后,以直径上的所有点为根,处理出不在直径上的点的倍增函数以及深度,则容易进行如下判断:
-
若询问点深度大于等于 ,则直接倍增向上跳。
-
若询问点深度小于 ,则直接跳到这棵子树在直径上对应的根,向更远的一段走即可。
给定一个长度为 的序列 。
求符合如下要求的长度为 的排列 的数量:
- 恰好存在 个不同的 满足
对 取模。
不难发现,题意等价于重新排列 。
考虑一种确定新的排列 的方式,我们将 中的元素从小到大放入 。
初始时,令 ,如果最后的序列形如 ,那么, 变化的过程依次为:。
由于 不小于 ,我们插入的元素必须在两个 之间,所以有一个多余的贡献,则我们最后需要 个 。
由于我们规定的顺序,思考插入一个数之后 数量的变化:
- 首先,插入一个 到 之间,此时其数量必然不会发生变化,因为
- 若插入一个 到 之间,此时数量可能会增加 ,但是需要注意相同的数的数量,所以我们需要维护一个变量,记录已经插入到 中和 相同的数的数量。
于是我们维护 表示插入了 个数,有 个位置满足 ,则可以在 的时间复杂度内解决该为题。
给定一个长为 的序列 ,求该序列有多少个包含元素个数为奇数个的子序列,满足其和恰好为 ,答案对 取模。
定义一个 为当前选择的元素的和为 ,元素个数模 为 的方案数。
直接转移复杂度达到了 ,显然不可取。
令 ,即 为一个多项式,元素的和 为 的质数,设已知两个多项式 和 ,考虑如何将其转移为 :
即为一个卷积运算。
那么,我们将初始的若干个元素,每个元素单独成立一个多项式,并将其加入一个多项式的集合 ,每次,我们取出 中的前两个元素,将他们卷积,再放入末尾。
虽然多项式的长度质数级增长,但 中的元素个数同样质数级减小,故而我们可以在 的时间复杂度内解决这个问题。
更具体的,对于元素 ,我们令其对应的多项式,零次项和 次项系数设为 ,分别代表空集和单独选择元素 ,这样我们做出来没有考虑奇偶性,最后多项式的 次项对应的答案为奇数加偶数。
我们再做一遍同样的过程,这次将零次项系数设为 , 次项系数设为 ,这样卷积过后,最后多项式 次项对应的答案为偶数减奇数。
将两次答案相减,可得两倍奇数,除二即为正确答案。
本文作者:未央境
本文链接:https://www.cnblogs.com/Defoliation-ldlh/p/16655881.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步