又是树上问题,选择一个点的代价是 ,选完所有点之后对于每个点 ,找出最大的 ,使得 满足 的所有点 全部被选,那么你就可以获得 的收益,求最大净收益。
肯定是树上 ,我们考虑它有什么限制:就是对于一个点,如果他有 的贡献,那么就要求他方圆 内的点全部选上,那么就把他加入状态中。所以设 表示对于 点,他方圆 内的点必须全部选上,此时考虑完 及其子树的最大收益。
首先要求 ,只能由 转移而来,因为一个点 ,他要求 方圆 内都被选上,那么对于 方圆至少 内必须都选上。
其次要注意到限制 是双向的,即对于 方圆 内的都选上,那么对于 方圆至少 内的都得选上,即 。
综上所述,我们有转移方程式:
直接暴力转移即可,时间复杂度 。
首先注意到最后一个 操作前的操作都没有用,那么我们只考虑一个 操作和后面的一群 操作,于是就将题意转化成了一个数乘上一堆数的形式。
对于后面那一堆数,我们可以直接跑背包去做,然后枚举 操作的数再跑一遍类似背包的操作去计算答案,时间复杂度 的。
考虑如何优化背包,乘法是难以优化的,而且注意到数据范围保证 是个质数,于是可以从正上面下手。有一个东西叫原根,它的性质就是:对于一个数 ,他的一个原根 ,满足 两两互不相等,也就是说对于任意整数 满足 ,我们可以用 来表示他。
于是原根就将乘法转化成了加法,然后我们就可以用 std::bitset
优化背包,时间复杂度 ,好像过不去,但是我们过滤掉多余的操作,比如进行背包时,一个数 出现了多次,但对 做了几次背包后发现没有用了,那么 就永远没用了。这样复杂度就是 的,刚好能过。
还有一个时间复杂度更优的是哈希加二分。仔细思考每次背包都是将原来区间右移一段后与原来区间或上,我们每次找出这两段区间第一个不一样的点,然后或起来。

首先如果我们每次找到的都是有用的点的话,那么只会找 次,但是我们每次都可能会找到一些无用的点,但是我们考虑两个序列的和是一样的,那么每个上面是 ,下面是 的不同会导致下面的和多 ,那么这些 会被上 下 的给来回来,所以他们俩数量相等,于是就只有 次,那么均摊就是 的 。(但是我没写)
图论结论太多了,完全不会啊。(
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章