2025省选模拟5

 


2025省选模拟5

T1、 Giao 徽的烤鸭

又是树上问题,选择一个点的代价是 wi ,选完所有点之后对于每个点 i ,找出最大的 d ,使得 d 满足 dis(j,i)d 的所有点 j 全部被选,那么你就可以获得 vd 的收益,求最大净收益。

肯定是树上 DP ,我们考虑它有什么限制:就是对于一个点,如果他有 vd 的贡献,那么就要求他方圆 d 内的点全部选上,那么就把他加入状态中。所以设 fi,j 表示对于 i 点,他方圆 j 内的点必须全部选上,此时考虑完 i 及其子树的最大收益。

首先要求 fi,j ,只能由 fk,p,fak=i,pj1 转移而来,因为一个点 i ,他要求 i 方圆 j 内都被选上,那么对于 k 方圆至少 j1 内必须都选上。

其次要注意到限制 j 是双向的,即对于 i 方圆 j 内的都选上,那么对于 fai 方圆至少 j1 内的都得选上,即 fi,jffai,k,kj1

综上所述,我们有转移方程式:

fi,j=vjwi+k,fak=imax(fk,j1,fk,j,fk,j+1)

直接暴力转移即可,时间复杂度 O(n2)

T2、 A Dance of Fire and Ice

首先注意到最后一个 0 操作前的操作都没有用,那么我们只考虑一个 0 操作和后面的一群 1 操作,于是就将题意转化成了一个数乘上一堆数的形式。

对于后面那一堆数,我们可以直接跑背包去做,然后枚举 0 操作的数再跑一遍类似背包的操作去计算答案,时间复杂度 O(np) 的。

考虑如何优化背包,乘法是难以优化的,而且注意到数据范围保证 p 是个质数,于是可以从正上面下手。有一个东西叫原根,它的性质就是:对于一个数 p ,他的一个原根 g ,满足 gk,k[1,p1] 两两互不相等,也就是说对于任意整数 x 满足 1xp1 ,我们可以用 gk 来表示他。

于是原根就将乘法转化成了加法,然后我们就可以用 std::bitset 优化背包,时间复杂度 O(npw) ,好像过不去,但是我们过滤掉多余的操作,比如进行背包时,一个数 x 出现了多次,但对 x 做了几次背包后发现没有用了,那么 x 就永远没用了。这样复杂度就是 O(p2w) 的,刚好能过。

还有一个时间复杂度更优的是哈希加二分。仔细思考每次背包都是将原来区间右移一段后与原来区间或上,我们每次找出这两段区间第一个不一样的点,然后或起来。

image

首先如果我们每次找到的都是有用的点的话,那么只会找 O(p) 次,但是我们每次都可能会找到一些无用的点,但是我们考虑两个序列的和是一样的,那么每个上面是 1 ,下面是 0 的不同会导致下面的和多 1 ,那么这些 1 会被上 01 的给来回来,所以他们俩数量相等,于是就只有 O(p) 次,那么均摊就是 O(plog2p) 的 。(但是我没写)

T3、 挖掘机技术哪家强

图论结论太多了,完全不会啊。(

posted @   lzrG23  阅读(32)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
点击右上角即可分享
微信分享提示