一道模拟赛的题
题目中给定的数值都是小于1e6的,
那么我们就可以暴力把线段树上的每个点拆成二进制表达,也就是20位,线段树上的每个点的二进制表示这个区间这位二进制为1的数量。
建树就非常简单,考虑懒标记和查询还有修改。
我们知道异或是满足分配率的,即(x^y)^c=x^(y^c);
那么我们就可以用懒标记来维护异或值;
每次修改区间,我们再暴力拆开异或值,如果一位是1,那么这个区间的这个位上的1就等于$(r-l+1)-f[i][k]$;
懒标记就是直接异或上一层懒标记同时对这个区间进行修改就行了
查询的时候把下面的两个区间的1的数量相加就行。
最后得到答案的时候再把二进制转回来就行了。
复杂度$ O(20nlogn) $ ???
算了还是 $ O(能过)$
1 |
|