【HNOI2016】最小公倍数

来源:互联网 发布:王者荣耀kda算法 编辑:程序博客网 时间:2024/06/05 22:58

题意

给定一个N个点M条边的无向图,每条边有两个参数(a,b)Q个询问,每个询问给S,T,A,B,求是否存在一条ST的路径(是“路径”而不是“简单路径”),使得经过的边中amax=A,bmax=B

N,Q50000
M105
a,b109

分析

    暴力的想法就是对于每个询问,只加aqabqb的边,维护一个并查集,最后看a,b是否联通,以及联通块中a,b的最大值是否为qa,qb
    我们考虑用分块优化。对于一条参数为(ai,bi)的边,它只对Aai的询问有用。我们将边按a排序,分块,把每条边加到整块都能用到该边的块中。询问我们也将其插入它应在的块中。然后对于一个块,我们将其的询问和边按b从小到大排序,像暴力一样维护一个并查集,这里可以路径压缩。但这样是有漏洞的,因为对于某个A,某条边(ai,bi)满足aiA,但它没有插入这个块中,所以我们还要再扫一遍块内的边,把满足条件的边加入并查集。因为在这里每次询问的A没有单调性,所以我们的并查集还要具有回溯功能。
    最后,如果把每条边都加入每个满足条件的块中会T的。我们可以只将它插入到第一个满足条件的块中,然后相邻两个块归并排序。
    不妨设分块大小为LQ,M同阶,复杂度为O(MLlogN+MMLα(N)),最好的L应为MlogM,最终复杂度为O(MMlogM),但实测没有O(MMlogM)快。

0 0