题意如题,数据大概在: n , m < = 1 0 4 , 0 < = x < = 1 0 9 n,m<=10^4,0<=x<=10^9 n,m<=104,0<=x<=109
将一个数字拆成二进制的样子,那么与,或运算对每一位都做一次,那么就转化成了区间加减法。
如果一个子区间全1或全0就可以回溯了,否则继续递归下去暴力改数字。
没找到原题,写了一份对拍的代码,可以造点数据对拍一下。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
ll maxx[maxn<<2|1];
ll lazy[maxn<<2|1];
int is[maxn<<2|1][39];
int is01[maxn<<2|1][39];
void pushup(int k){
maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
for(int i=0;i<=30;++i){
if(is01[k<<1][i]==is01[k<<1|1][i]) is01[k][i]=is01[k<<1][i];
else is01[k][i]=2;
}
}
void pushup2(int k,int pos){
maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
if(is01[k<<1][pos]==is01[k<<1|1][pos]) is01[k][pos]=is01[k<<1][pos];
else is01[k][pos]=2;
}
void build(int l,int r,int k){<