萌新wa2完全找不到问题,wa25发也找不到问题,哭了
查看原帖
萌新wa2完全找不到问题,wa25发也找不到问题,哭了
182494
orzzimse楼主2024/11/27 19:33

拜托了QAQ,真的找不到

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
const int N=2e5+5;
int a[N],b[N];
vector<int>E[N];
struct LinearBasis{
    int p[32];
    void clear(){
        rep(i,0,30)
        {
            p[i]=0;
        }
    }
    void ins(int k){
        for(int i = 30; i >= 0; -- i){
            if(!(k&(1<<i))) continue;
            if(!p[i]) return p[i] = k, void();
            k ^= p[i];
        }
        return;
    }
    void ins(LinearBasis x){
        for(int i = 30; i >= 0; -- i)
            ins(x.p[i]);
    }
    int getmx(){
        int ans = 0;
        for(int i = 30; i >= 0; -- i) ans = max(ans, ans^p[i]);
        return ans;
    }
}pre[N],suf[N],s[N];
int st[N],ed[N],dis[N],f[N][22];
int tot;
void init(int n){
    tot=0;
    rep(i,0,n+1)E[i].clear(),st[i]=0,ed[i]=0,pre[i].clear(),suf[i].clear(),s[i].clear(),dis[i]=0;
    rep(i,0,n+1)rep(j,0,19)f[i][j]=i;
}
void dfs(int u,int fa){
    f[u][0]=fa;
    st[u]=++tot;
    s[u].ins(a[u]);
    b[tot]=a[u];
    for(auto v:E[u]){
        if(v==fa)continue;
        dis[v]=dis[u]+1;
        dfs(v,u);
        s[u].ins(s[v]);
    }
    ed[u]=tot;
}
void solve(){
    int n;
    cin>>n;init(n);
    rep(i,1,n){
        cin>>a[i];
    }
    rep(i,1,n-1){
        int u,v;cin>>u>>v;E[u].pb(v);E[v].pb(u);
    }

    dfs(1,-1);f[1][0]=1;
    rep(i,1,n){
        pre[i].ins(pre[i-1]);
        pre[i].ins(b[i]);
    }
    rep(i,1,n){
        suf[i].ins(b[i]);
        suf[i].ins(suf[i+1]);
    }
    rep(k,1,19){
        rep(i,1,n){
            f[i][k]=f[f[i][k-1]][k-1];
        }
    }
    int q;cin>>q;

    while(q--){
        int r,v;cin>>r>>v;
        if(r==v){
            printf("%d\n",pre[n].getmx());
        }
        else{
            if(dis[r]<=dis[v]){
                printf("%d\n",s[v].getmx());
            }
            else{
                int nw=r,d=dis[r]-dis[v]-1;
                while(d>0){
                    rep2(i,19,0){
                        if(d>=(1<<i)){
                            d-=(1<<i);
                            nw=f[nw][i];
                        }
                    }
                }
                if(f[nw][0]==v){
                    LinearBasis ans;ans=pre[st[nw]-1];
                    ans.ins(suf[ed[nw]+1]);
                    printf("%d\n",ans.getmx());

                }
                else{
                    printf("%d\n",s[v].getmx());
                }
            }
        }

    }
}

signed main() {
    int T;
    cin>>T;
    while(T--){
    solve();
    }
    return 0;
}

2024/11/27 19:33
加载中...