社区讨论

#3#4#5AC 其他 WA 求调

P3292[SCOI2016] 幸运数字参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m5j3i2f8
此快照首次捕获于
2025/01/05 12:11
去年
此快照最后确认于
2025/11/04 11:57
4 个月前
查看原帖
CPP
#define int long long
using namespace std;
#define fi first
#define sc second
#define pii pair<int,int>
#define pb push_back
#define umap unordered_map
#define mset multiset
#define pq priority_queue
#define ull unsigned long long
#define i128 __int128
const int maxn=2e4+10;
int n,m,a[maxn],f[maxn][17],dep[maxn];
vector<int> g[maxn];
struct XorBasic{
    int xb[64];
    bool zero=0;
    void init(){
        for(int i=0;i<=63;i++) xb[i]=0;
    }
    bool insert(int x){
        // cout<<":"<<x<<endl;
        for(int i=63;~i;i--){
            if(x&(1ll<<i)){
                if(!xb[i]) return xb[i]=x,1;
                else x^=xb[i];
            }
        }
        zero=1;
        return 0;
    }
    int querymax(int num=0){
        int maxx=num;
        for(int i=63;~i;i--){
            if(maxx&(1ll<<i)) continue;
            maxx^=xb[i];
        }
        return maxx;
    }
    void debug(){
        for(int i=0;i<=63;i++) if(xb[i]) cout<<xb[i]<<" ";
        cout<<endl;
    }
}x[maxn][17];
void merge(XorBasic &x1,XorBasic x2){
    for(int i=0;i<=63;i++) if(x2.xb[i]) x1.insert(x2.xb[i]);
}
void dfs(int u,int fa){
    f[u][0]=fa,x[u][0].insert(a[u]),dep[u]=dep[fa]+1;
    for(int i=1;i<=16;i++){
        f[u][i]=f[f[u][i-1]][i-1];
        x[u][i]=x[u][i-1],merge(x[u][i],x[f[u][i-1]][i-1]);
    }
    for(int v:g[u]) if(v!=fa) dfs(v,u);
}
int query(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    int d=dep[u]-dep[v];
    XorBasic res;
    res.init();
    res.insert(a[u]),res.insert(a[v]);
    for(int i=16;~i;i--){
        if(d&(1<<i)) merge(res,x[u][i]),u=f[u][i];
    }
    if(u==v) return res.insert(a[u]),res.querymax();
    for(int i=16;~i;i--){
        if(f[u][i]!=f[v][i]){
            merge(res,x[u][i]),merge(res,x[v][i]);
            u=f[u][i],v=f[v][i];
        }
    }
    res.insert(a[f[u][0]]);
    return res.querymax();
}
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1,u,v;i<n;i++) cin>>u>>v,g[u].pb(v),g[v].pb(u);
    dfs(1,1);
    while(m--){
        int u,v;
        cin>>u>>v,cout<<query(u,v)<<endl;
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--) solve();
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...