【HNOI2016】最小公倍数

题意

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

N,Q50000
M105
a,b109

分析

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

你可能感兴趣的:(【HNOI2016】最小公倍数)