Description:
给你一棵树和一个路径集合,每次询问某条给定路径包含的路径集合中第k大的路径的权值
Hint:
\(n,m\le 50000\)
Solution:
毒瘤题
先考虑这个包含的条件怎么判断? 先把原树的dfn求出来
1.如果两点没有祖先关系,则显然所求路径的端点分别位于两点子树中
即: \(dfn[a] \le x \le dfn[a]+sz[a]-1\) \(dfn[b] \le y \le dfn[b]+sz[b]-1\)
2.如果有祖先关系,则路径一端不变,另一端除这棵子树内其他位置都合法
即 \(dfn[a] \le x \le dfn[a]+sz[a]-1\) \(1 \le y \le dfn[b]+1\ \ or\ \ dfn[b]+sz[b] \le y \le n\)
把路径集合看成矩形
询问就是在求覆盖一个点的矩形中第k大的那个
考虑整体二分,把这些矩形按权值排序
每次递归时扫描线算出一个点被覆盖的次数,某时刻满足刚刚被覆盖k次,则找到答案
复杂度\(O(nlog^2n)\)
#include