Difficulty:6.4 / Easy+
Tag:整体二分,扫描线
我去我的 Idea 终于被用到了。
首先考虑一个路径该如何是另一个路径的子路径。显然沿着另一个路径的两端一直走就行。
所以如果路径两端一个点不是另一个点的祖先节点,那只能分别取两端的子树上一点作为两端;如果一个点是另一个点的祖先,那还得考虑祖先到根的路径。
然后转换成 dfn 以后就是两个区间了。这时候问题转换成 n×nn\times nn×n 的矩阵,子矩阵加,单点查询第 kkk 小,所有查询在修改后。
整体二分加动态开点二维线段树即可做到 O(nlog3n)O(n\log^3 n)O(nlog3n)。3log* 接近 1log 的常数你觉得过得去吗(
注意到查询的数量很小,不需要得到整个矩阵。我们可以扫描线扫一遍,转换成一维的区间加减问题。
O(nlog2n)O(n\log^2 n)O(nlog2n)。