CSP-S 2024 第八次

忘记写了,补一下

A

依次加入每个 ai,拿个大根堆维护当前以 i 结尾的和最大子段,和超过 s 了就弹堆顶直到和不超过 s

……但是这样是错的,考虑加入一个负的 ai 后,取堆中最小的几个数使得它们的和大于 0

则删掉这些数中的最大值后剩下的数也不会被取,也就是说要删掉这些数只需要删一次,把它们拿出来加在一起塞回去即可。

s 是负数的话删掉所有大于等于 sai 即可。不过好像出现了一些语文事故,先不管了。

B

倍增预处理出 fi 表示 i 上方第一个大于 ai 的点,

询问 u,v,c 时,先倍增找到 u 上方第一个大于 c 的点 x,然后就要求跳(xfx)几次能跳出 v,在 f 上倍增即可。

C

最大值最小,先二分最大值 K

fu,x,y 表示是否存在走完 u 子树,u 到第一个叶子的距离为 x,最后一个叶子到 u 的距离为 y 的方案,

可以发现 xx,yy,fu,x,y=1 时我们就不关心 fu,x,y 了,所以在我们关心的状态中 yx 的增大而减小,

而且我们关心的 fu,x,y 只有 O(su) 个(suu 的叶子个数),因为 x,y 都只有这么多种。

考虑转移,钦定先走左子树时,对于左子树 l 中每个我们关心的状态 fl,x1,y1

其能与右子树 r 中的 fr,x2,y2 合并成 fu,x1,y2 当且仅当 y1+vl+vr+x2K

y2 肯定越小越好,所以肯定取满足条件的最大的 x2 进行转移,双指针维护。

钦定先走右子树同理,最后只留下我们关心的状态就行。

D

【模板】最小斯坦纳树

fu,S 表示以 u 为根的树覆盖 S 中的点的最小代价,考虑转移:

  • 不改变根,可以合并已有的两棵树,即 fu,S+fu,Tfu,ST
  • 改变根,可以在根上连接一条边,即 fu,S+e(u,v)fv,S,其中 e(u,v)u,v 之间的边权。

第一种转移直接枚举子集做,第二种转移类似 Dijkstra 地做即可。

posted @   Jijidawang  阅读(60)  评论(11编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示