MnZn 求助线性基
查看原帖
MnZn 求助线性基
420129
Nt_Tsumiki楼主2024/7/3 16:57

rt

全 WA,思路与 link 同

#include <iostream>
#include <cstdio>

#define N 50001

using namespace std;
int n,m,a[N];

struct Tree { int sum,ans,bs[30]; }res,t[N<<2];

void ins(Tree &x,int val) {
    for (int i=29;i>=0 and val;i--) 
        if ((val>>i)&1) {
            val^=x.bs[i];
            if (!x.bs[i]) { x.bs[i]=val; break; }
        }
}

void getans(Tree &x,int v) {
    x.ans=v;
    for (int i=29;i>=0;i--) x.ans=max(x.ans,x.ans^x.bs[i]);
}

void upd(int x,int l,int r,int pos,int val) {
    if (pos>r) return;
    if (l==r) {
        for (int i=29;i>=0;i--) t[x].bs[i]=0;
        return ins(t[x],t[x].sum^=val);
    }
    int mid=(l+r>>1);
    if (pos<=mid) upd(x<<1,l,mid,pos,val);
    else upd(x<<1|1,mid+1,r,pos,val);
    t[x].sum=t[x<<1].sum^t[x<<1|1].sum;
    for (int i=29;i>=0;i--) ins(t[x],t[x<<1].bs[i]),ins(t[x],t[x<<1|1].bs[i]);
}

void ask(int x,int l,int r,int L,int R) {
    if (L>R) return;
    if (L<=l and r<=R) {
        for (int i=29;i>=0;i--) ins(res,t[x].bs[i]);
        return;
    }
    int mid=(l+r>>1);
    if (L<=mid) ask(x<<1,l,mid,L,R);
    if (R>mid) ask(x<<1|1,mid+1,r,L,R);
}

int ask0(int x,int l,int r,int L,int R) {
    if (L<=l and r<=R) return t[x].sum;
    int mid=(l+r>>1),res=0;
    if (L<=mid) res^=ask0(x<<1,l,mid,L,R);
    if (R>mid) res^=ask0(x<<1|1,mid+1,r,L,R);
    return res;
}

int main() {
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",a+i);
    for (int i=n;i;i--) a[i]=a[i]^a[i-1],upd(1,1,n,i,a[i]);
    for (int i=1,op,l,r,v;i<=m;i++) {
        scanf("%d%d%d%d",&op,&l,&r,&v);
        if (op==1) upd(1,1,n,l,v),upd(1,1,n,r+1,v);
        else {
            res.ans=0; for (int j=29;j>=0;j--) res.bs[j]=0;
            int tmp=ask0(1,1,n,1,l);
            ask(1,1,n,l+1,r); ins(res,tmp); getans(res,v);
            printf("%d\n",res.ans);
        }
    }
    return 0;
}
2024/7/3 16:57
加载中...