题目大意
给出一张NNN个点MMM条边的无向图,保证图连通。你有QQQ个行程,第iii个行程的起点是SiS_iSi,终点是EiE_iEi。在每个行程开始时你必须是人形,在每个行程结束时你必须是狼形,且途中只能在[Li,Ri][L_i,R_i][Li,Ri]内的某个点变身。问每次行程能否完成。
N⩽200000N\leqslant 200000N⩽200000,M⩽400000M\leqslant 400000M⩽400000,Q⩽200000Q\leqslant 200000Q⩽200000。
思路
前置芝士:Kruskal重构树,二维数点。
每个可行的行程可以表示成:Si→X→EiS_i\rightarrow X\rightarrow E_iSi→X→Ei,其中Li⩽X⩽RiL_i\leqslant X\leqslant R_iLi⩽X⩽Ri。
以X→EiX\rightarrow E_iX→Ei这一部分路径为例。这条路径可以等价成Ei→XE_i\rightarrow XEi→X。我们需要找出从EiE_iEi出发,经过的点的编号最大不超过RiR_iRi,能够到达的所有点,这些点都有可能成为XXX。路径上的最大点权尽可能小,假装容易想到最小生成树。但是生成树处理的是边权,这里要把点权转到边权:经过一条边时,一定会经过这条边的两个端点,因此可以把边权设为两个端点编号的最大值。然后建一棵传说中的Kruskal重构树。为了后面讨论方便,叶子结点的点权设为本身的编号。于是原图中两点路径上的最大点权的最小值就是树中两点的LCA的点权。并且,由于连通块是按权值从小到大合并的,树中非根节点的点权一定不会超过父亲的点权。
在重构树中找到点SiS_iSi,倍增找到其祖先中深度最浅、点权不超过RiR_iRi的点,则点XXX必须在以该点为根的子树内。
同理,需要找出从SiS_iSi出发,经过的点的编号最小不低于LiL_iLi,能够到达的所有的点:边权取两个端点的点权的最小值,求最大生成树,在重构树上倍增,找到深度最浅、点权不低于LiL_iLi的点,则点XXX必须在以该点为根的子树内。
于是点XXX在两棵重构树上的DFS序各有一个范围,以每个点分别在两棵树上的DFS序为横纵坐标,转换成二维数点问题。