【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) 快。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值