xor
思路
题目是要求[l,r][l, r][l,r]的所有集合是否都可以得到xxx,那么显然我们可以对这[l,r][l, r][l,r]个线性基求交,然后再特判能否xxx能否插入,如果能插入,显然输出NONONO,否则就输出YESYESYES,所以问题转换成了如何求这[l,r][l, r][l,r]个集合的线性基交了。
有个最简单的方法就是用线段树来维护了,然后暴力的得到[l,r][l, r][l,r]中的log(n)log(n)log(n)个线性基交,然后再判断是否有集合是无法构成xxx的即可。
代码
/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}// typedef unsigned int ui;const int N = 5e4 + 10;struct LinearBasis {ll base[35];void init() {memset(base, 0, sizeof base);}ll & operator [] (int pos) {return base[pos];}bool insert(ll x) {for(int i = 31; i >= 0; i--) {if(x >> i & 1) {if(!base[i]) {base[i] = x;return true;}x ^= base[i];}}return false;}bool judge(ll x) {for(int i = 31; i >= 0; i--) {if(x >> i & 1) {if(!base[i]) {return true;}x ^= base[i];}}return false;}LinearBasis inter (const LinearBasis & t) {LinearBasis ans, c = t, d = t;ans.init();for(int i = 0; i < 32; i++) {if(!base[i]) continue;int p = i;ll x = base[i], temp = 0;for(int j = p; j >= 0; j--) {if(x >> j & 1) {if(c[j]) {x ^= c[j]; temp ^= d[j];}else {p = j; break;}}}if(!x) {ans[i] = temp;}else {c[p] = x; d[p] = temp;}}return ans;}
}tree[N << 2];void push_up(int rt) {tree[rt] = tree[ls].inter(tree[rs]);
}void build(int rt, int l, int r) {if(l == r) {int n = read();for(int i = 1; i <= n; i++) {ll x = read();tree[rt].insert(x);}return ;}build(lson);build(rson);push_up(rt);
}int flag;void query(int rt, int l, int r, int L, int R, ll x) {if(l >= L && r <= R) {if(tree[rt].judge(x)) flag = 0;return ;}if(L <= mid) query(lson, L, R, x);if(R > mid) query(rson, L, R, x);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n = read(), m = read();build(1, 1, n);for(int i = 1; i <= m; i++) {int l = read(), r = read(); ll x = read(); flag = 1;query(1, 1, n, l, r, x);puts(flag ? "YES" : "NO");}return 0;
}