LOJ3225「PA 2019」Podatki drogowe【二分,边分治,主席树】
给定 \(n\) 个点的树,第 \(i\) 条边 \((a_i,b_i)\) 的边权 \(n^{p_i}\)。
求 \(\binom n2\) 个 \(d(u,v)\) 中第 \(k\) 小的值。
\(n\le 2.5\cdot 10^4\),\(1\le k\le\binom n2\),\(1\le a_i,b_i,p_i\le n\)。
因为值域大,所以随机取数进行二分。
因为不太能判断什么时候停止二分,所以取个定值,比如 \(50\) 次。
为了方便地做 two-pointer,考虑边分治,固定一端就可以对另一端排序然后做 two-pointer。
为了方便地比较两条路径的大小,可以用类似字符串 hash 算 lcp 的方式,用主席树维护 hash 值即可。
这里的主席树是套在边分治内层的,于是空间 \(O(n\log^2n)\),时间 \(O(n\log^3n)\)。
实现比较烦,不想写代码啊啊啊啊啊啊。。。