P9531 题解

blog。提供一份代码短的题解。


一个暴力做法:维护 wi<wnowwiwnow 的前后缀 MST,查 Xi 时将前后缀 MST 合并,直接求得答案。

考虑一棵 (unow,vnow,W) 的前缀 MST。因为 wi<Wwi 越大 |Wwi| 越小,所以枚举所有 wi<W,按边权从大到小加边:

  • 先忽略掉 (unow,vnow) 的边。
  • 对于其他 wi<W,尝试加入。如果成功加入并且构成了包含 (unow,vnow) 的环,显然需要删除最大边,加入最小边。显然最大边就是 wi,最小边就是 wnow,删掉 i 并加入 now

找到这个 i。那么 wnow 对答案有贡献,当且仅当询问的 XXwi>wnowX,即 X>wi+wnow2

同理,wiX>wi+wnow2 时会结束贡献。那么每条边都会有一个贡献区间,可以加入 MST 当且仅当在贡献区间内


用并查集模拟上述算法,找出贡献区间 [li,ri],那么对于不同的 X,边 i 的贡献为:

  • X<li,没有贡献。
  • liX<wi,贡献为 |Xwi|=wiX
  • wiX<ri,贡献为 |Xwi|=Xwi
  • Xri,没有贡献。

写个指针状物,因为询问的 Xi 有序,顺着扫一遍即可。可以看代码理解。


code,时间复杂度 O(nm+qlogm)

写了 1.5k,其实应该可以写进 1k 的(

posted @   liangbowen  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示