2018.10.26 NOIP模拟 图(最小生成树+线段树合并)

传送门
首先最开始说的那个一条路径的权值就是想告诉你两个点之间的贡献就是瓶颈边的权值。
那么肯定要用最小生成树算法。
于是我考场上想了 30 m i n + 30min+ 30min+的树形 d p dp dp
发现转移是优秀的 n l o g n nlog_n nlogn,总时间复杂度 O ( n 2 l o g n ) O(n^2log_n) O(n2logn)妙啊
然后有了弃疗的想法。
突然想到没有利用 k r u s k a l kruskal kruskal算法的性质。
其实就是一个 k r u s k a l kruskal kruskal重构树用到的思想,对于两个连通块,当前这条将它们连接起来的边是两个连通块的点连通的瓶颈
这就好办了。
只用算出这条边贡献了几次就行了。
咦线段树合并可做啊总复杂度 O ( n l o g n 2 ) O(nlog^2_{n}) O(nlogn2)妙啊
咦等等好像启发式合并更好写啊。
咦等等…
终于等到了一个妙不可言的时刻。
我发现题目给的式子可以变形啊!
设对于限制 ∣ C u − C v ∣ ≥ L |C_u-C_v|\geq L CuCvL中较大的数为 x x x,较小的数为 y y y.
=> x ≥ y + L x\geq y+L xy+L
=> x > y + L − 1 x>y+L-1 x>y+L1
那么对于所有点,我们将 C i C_i Ci C i + L − 1 C_i+L-1 Ci+L1共同离散化。
然后对 C i C_i Ci C i + L − 1 C_i+L-1 Ci+L1分别维护两种权值线段树。
之后直接线段树合并就行了。
时间复杂度 O ( n l o g n ) O(nlog_n) O(nlogn)吊了标算?妙啊
放一波代码

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值