题目
http://acm.hdu.edu.cn/showproblem.php?pid=6109
分析
对于相同的条件,明显直接并查集
对于不同的条件,可以用set来保存,并查集合并的时候也要对set启发式合并
还有另一种很奇妙的做法
如果我们只考虑一段[l..r]是否可行,那么我们可以离线,先挑出相同的条件构出并查集,然后对所有的不同条件进行判断就行了
这样我们就可以写出一个时间复杂度为O(r-l)的check(l,r)
那我们怎么分段呢?
我们对于当前起点now,进行倍增寻找长度最小的L(L=2^k)使得[now...now+L]这一段不能构成一段
然后我们再对[now..now+L]进行二分寻找准确的分界点
时间复杂度O(nlogn)
时间: 2024-12-06 14:13:44