因为我记忆力不好,经常遇到之前做过的题一下子想不起来,所以打算基本上给每个比较有意思的题写题解,同时造福后代。
这是werewolf,它是furry,很可爱
题意:一张无向图,点有点权,每次询问从 \(u\) 到 \(v\) 的路径中,是否存在一条先走点权大于等于 \(L\),再走点权小于等于 \(R\) 的路径。
思路:从起点找到所有可以到达的点权大于等于 \(L\) 的节点,为集合 \(A\),然后从终点找到所有可以到达的点权小于等于 \(R\) 的点,为集合 \(B\)。如果 \(A\bigcap B\ne \varnothing\),则存在这样的路径,否则不存在。
考虑 kruskal 重构树,关于 kruskal 重构树
构建一个小顶堆(人走),然后从起点往上跳知道节点权值小于 \(L\),此时跳的上一个点的子树中就全是权值小于等于 \(L\) 的点。大顶堆(furry走)同理。
两个堆分别建一个 dfn 序列 \(a\) 和 \(b\),此时就相当于询问序列 \(a\) 中 \(l_a\) 到 \(r_a\) 范围内的元素有没有在序列 \(b\) 中 \(l_b\) 到 \(r_b\) 的范围内出现。(二维数点),直接上离线树状数组或者主席树即可。
代码
//咕咕咕
标签:小于,werewolf,题解,点权,狼人,P4899,等于
From: https://www.cnblogs.com/Ishar-zdl/p/17982534