题意:给你n个数,每次询问一个区间,问询问区间的子区间数取&去重后一共有多少个,强制在线
题解:首先由与是&操作,那么对于第i个位置,不管是往左还是往右取&都是一个不增区间,具有单调性了,那么我们其实是可以通过二分来求得对于第i个位置,它往一个方向取&后会在哪些地方改变,如果可以离线那么这道题就可以和REQ这道题类似的做法,但是本题强制在线,而且询问是区间询问可以考虑用主席树来进行维护,大体思路与REQ类似,对于每一个取&后的数,如果是第一次出现那就在对应时间戳的对应位置插入1代表他的贡献,如果已经出现,就将之前的贡献删除,在当前变小的位置插入贡献。解释一下这样做的正确性,感性理解,主席树继承了上一个位置的所有信息,那也就代表的当前位置的时间戳已经包含了之前的所有信息,但是在加入当前位置的信息后,它有部分信息是重复的,所以对于每一种出现的数都是将它放在了最靠近i的位置,在查询是就可以做到每一种&出来的值只进行的一个贡献统计,然后每次都是在当前的时间戳进行处理,之前已经维护的信息是没有变过的,所以查询时在ti[r]时间查询[l,r]的和时就是去重后的答案了。
一个数转为二进制后,最多有log位,所以减小后的个数最多只有log位,加上二分,复杂度为平方级的,主席树也是log级的,所以总复杂度为(nlog2n+mlogn),可能常数偏大
AC代码:
#include
#include
#include
#include
#include
#include
#include