2016中国大学生程序设计竞赛 - 网络选拔赛

2016中国大学生程序设计竞赛 - 网络选拔赛

HDU 5840 This world need more Zhu

题意

  • 给一棵有\(N(N \le 10^5)\)个点的树
  • \(M(M \le 10^5)\)次询问,每次求\(u \to v\)路径上第\(K、2K、...、pK\)个数中最大的权值\(max\{A_i\}\)

思路

  • 定义一个界限\(B\)
  • 对于\(K>B\)的询问,用栈维护当前点到根的路径信息,每次暴力向上跳\(K\)步(因为对于\(K \le B\)的用到树剖,我的做法是每次根据当前点\(u\)\(top[u]\)的距离跳)。这样的时间复杂度为\(O(\frac{NM}{B})\)
  • 对于\(K \le B\)的询问
    1. 对于每个询问,拆成\(u\to lca\)\(v \to lca\)两条链的询问。
    2. 对于\(u \to lca\)来说,可取的点满足\((dep[u]-dep[x]+1)\%K=0\),即\[dep[x]\%K=(dep[u]+1)\%K\]
    3. 对于\(v \to lca\)来说,可取的点满足\((dep[u]-dep[lca]+dep[x]-dep[lca]+1)\%K=0\),即\[dep[x]\%K=(2dep[lca]-dep[u]-1)\%K\]
    4. 因为是查询链上的最值,所以容易想到用树链剖分+线段树维护。
    5. 每次询问都是查找\(dep\%K\)中的最大权值,所以对于\(K、dep\%K\)相同的询问一块做即可。
    6. 时间复杂度\(O(BNlogN+MlogNlogN)\)

代码

转载于:https://www.cnblogs.com/mcginn/p/5835936.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值