看到异或我们很自然地想到二进制拆位。
我们对于线段树的每个节点,建一个数组 s u m sum sum。
s u m [ i ] sum[i] sum[i]表示当前节点的儿子中有多少个数的二进制有第i位
因为这题是区间修改,所以再建一个 l a z y [ i ] lazy[i] lazy[i]表示懒标记
再对线段树的代码稍作调整这题就大功告成了!
贴个代码
# include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int inf = INT_MAX;
#define int long long
#define FOR(i,a,b) for(int i = a;i <= b;i++)
#define _FOR(i,a,b) for(int i = a;i >= b;i--)
#define l(x) x << 1
#define r(x) x << 1 | 1
template<typename T> void read(T &x)
{
x = 0;int f = 1;
char c = getchar();
for(;!isdigit(c);c = getchar()) if(c == '-') f = -1;
for(;isdigit(c);c