为什么用了交互但是不强制在线啊???
在线算法玩家表示不爽。
这题算是个变种的 Kruskal 重构树。
主要改变在于并没有给出边权,而是通过点的编号来重构。
此题即在经过点的编号在某个限制下,求两个点各自的连通块的交集是否为空。
所以前半部分很容易想到 Kruskal 重构树。
上面已经说了是要按照点的编号来重构树,具体过程为:
- 把边按照编号较大的点排序。
- 做 Kruskal 过程,同时重构一棵树。
- 重构出来的树满足每一个非根结点的编号小于父节点的编号。
然后重构出另一棵与之对应的树。
于是询问就是分别在两棵重构出来的树上找到点的编号 ∈[0,R] 和 [L,N) 的两棵子树。
因为众所周知 Kruskal 重构树具有单调性,所以树上倍增。
然后众所周知 Kruskal 重构树的一棵子树对应一个连通块,所以相当于求两棵子树的交集。
子树?DFS 序!于是 DFS 序后主席树维护即可。
具体地说,设 id1,i,id2,i 分别表示点 i 在两棵树上的 DFS 序,
那么对于每个 i,就是一个矩阵上坐标为 (id1,i,id2,i) 的点。
问题就变成了一个子矩阵里的点数。
灰常经典,而且是静态的。
代码:
1 |
|