传送门
给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\)。
线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~
线性基交学习博客:传送门
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned int ui; typedef long long LL; typedef pair pLL; typedef pair pLi; typedef pair pil;; typedef pair pii; typedef unsigned long long uLL; #define lson rt<<1 #define rson rt<<1|1 #define lowbit(x) x&(-x) #define name2str(name) (#name) #define bug printf("*********\n") #define debug(x) cout<<#x"=["<=0;i--) if (x>>i){ if (!r[i]) {r[i]=x;return 1;} x^=r[i]; if (!x) return 0; } return 0; } void ins2(ui x){ ui tmp=x; for (int i=31;i>=0;i--) if (x>>i){ if (!r[i]) {f[i]=tmp;r[i]=x;return;} x^=r[i]; tmp^=f[i]; if (!x) return; } return; } bool find(ui x){ for (int i=31;i>=0;i--) if (x>>i){ if (!r[i]) return 0; x^=r[i]; } return x==0; } ui calc(ui x){ ui ret=0; for (int i=31;i>=0;i--){ if (x>>i){ ret^=f[i]; x^=r[i]; } } return ret; } void print(){ for (int i=0;i<32;i++)cout<= 0; --i) { ui x = segtree[rson].val.r[i]; if(tmp.find(x)) { ans.ins(x^tmp.calc(x)); } else tmp.ins2(x); } segtree[rt].val = ans; } void build(int rt, int l, int r) { segtree[rt].l = l, segtree[rt].r = r; if(l == r) { for(int i = 0; i <= 31; ++i) segtree[rt].val.ins(a[l][i]); return; } int mid = (l + r) >> 1; build(lson, l, mid); build(rson, mid + 1, r); push_up(rt); } bool query(int rt, int l, int r, LL x) { if(segtree[rt].l == l && segtree[rt].r == r) { return segtree[rt].val.find(x); } int mid = (segtree[rt].l + segtree[rt].r) >> 1; if(r <= mid) return query(lson, l, r, x); else if(l > mid) return query(rson, l, r, x); else { return query(lson, l, mid, x) && query(rson, mid + 1, r, x); } } int main() { #ifndef ONLINE_JUDGE FIN; #endif // ONLINE_JUDGE scanf("%d%d", &n, &q); for(int i = 1; i <= n; ++i) { scanf("%d", &sz); for(int j = 0; j < sz; ++j) scanf("%lld", &a[i][j]); for(int j = sz; j <= 31; ++j) a[i][j] = 0; } build(1, 1, n); while(q--) { scanf("%d%d%lld", &l, &r, &x); if(query(1, l, r, x)) printf("YES\n"); else printf("NO\n"); } return 0; }