题目链接:
给你n个数,m次查询,每次查询问你l到r之间出现偶数次的数字xor和是多少。
我们可以先预处理前缀和Xor[i],表示1~i的xor和。因为num^num=0,所以Xor[r] ^ Xor[l - 1]求的是l~r之间出现奇数次的数字xor和。
那怎么求偶数次的呢,那我们可以先求l到r之间不重复出现数字的xor(比如1 1 2 求的是1 ^ 2),然后再xor以上求出的Xor[r] ^ Xor[l - 1],奇奇消掉 就得出答案了。
那求不重复的话,我们用树状数组来处理。先把询问按照r从小到大排序,以便后面的离线处理。map存的是a[i]数字最近出现的位置i,然后用树状数组i位置插入a[i]并且消掉a[i]之前出现的位置i',这样保证查询不重复xor和最优。
具体看代码,应该能看懂。
1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include
12 #include
上面是正确的代码,下面是TLE的。
之前用莫队写的,数据小一点应该可以过。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include