二维偏序
多校和网络赛多次越到这种题目,所以把这类题目都放到一起总结一下;
这类题目主要是求区间l到r中。。。的数量。用了树状数组,肯定是利用前缀和的思想来解决问题;
Codeforces 703D Mishka and Interesting sum
题意:给n个数,q个询问,每次询问求区间出现次数为偶数次的数的异或和
思路:用前缀和思想很容易想到 答案=区间出现的不同的数的异或和^区间出现奇数次的数异或和(出现偶数次不好求,那么就间接求) 出现奇数次很容易求,维护一个前缀异或和就行了,求区间不同数异或和主席树,树状数组都可以做;
Codeforces 301D Yaroslav and Divisors
题意:给一个n个数的排列,q个区间查询,输出每个区间a%b==0的a,b对数,a可以等于b;
思路:第一次想到的是莫队 算了一下时间复杂度 n*sqrt(n)*log(n) 卡不过去,正解是用数状数组+排序+乱搞;
我们要求区间l,r的a%b==0的数量 那么可以用sum[r]-sum[l-1],sum[r]表示从1到r中a%b==0的数量;那么就会出现少减的情况;
既a出现在l到r中, b出现在1到l-1中(假设这种情况为情况1) 或者a出现在1到l-1中,b出现在l到r中(情况二)
那么ans=sum[r]-sum[l-1]-情况1-情况2;我们将询问用二个数组(q1,q2)存起