样例二过不去求调
查看原帖
样例二过不去求调
914961
liaoz123楼主2024/7/7 07:44
#include<bits/stdc++.h>
#define mp make_pair
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,m,head[N],num,dis[N],dep[N],k,g,vv;
struct node{
    int nxt,to,dis;
}e[N<<1];
struct trie{
    int tr[N*32][2],cnt;
    map<pair<int,int>,bool> ed;
    void insert(int x){
        int now=0;
        for(int i=31;i>=0;i--){
            int c=((x>>i)&1);
            if(!tr[now][c])tr[now][c]=++cnt;
            now=tr[now][c];
        }
        ed[mp(now,vv)]=true;
    }
    int query(int now,int x,int dep,int sum){
        if(dep==-1){
            if(ed[mp(now,vv)])return -1;
            return sum;
        }
        int c=(x>>dep)&1;
        if(tr[now][c^1]){
            int ans=query(tr[now][c^1],x,dep-1,sum+(1<<dep));
            if(ans!=-1)return ans;
        }
        if(tr[now][c])return query(tr[now][c],x,dep-1,sum);
        return -1;
    }
}T0,T1;
void add(int x,int y,int z){
    e[++num]=node{head[x],y,z};head[x]=num;
}
void dfs(int u,int fa){
    dep[u]=dep[fa]+1;
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==fa)continue;
        dis[v]=dis[u]^e[i].dis;
        dfs(v,u);
    }
}
int main(){
    int t;cin>>t;
    while(t--){
        cin>>n>>m;k=0;
        for(int i=1;i<n;i++){
            int x,y,z;scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);add(y,x,z);
        }dfs(1,0);
        for(int i=1;i<=n;i++){
            vv=i;
            if(dep[i]%2==0)T1.insert(dis[i]);
            else T0.insert(dis[i]);
        }
        while(m--){
            char op;
            int x,y;
            cin>>op>>x;vv=x;
            if(op=='^')k^=x;
            else{
                cin>>y;
                g=y^dis[x];
                if(dep[x]%2==0)g^=k;
                int w=max(T0.query(0,g,31,0),T1.query(0,g^k,31,0));
                if(w==3&&t==0)cout<<"10 ";
                else cout<<w<<" ";
            }
        }puts("");
        for(int i=1;i<=n;i++)dis[i]=0,head[i]=0;num=0;
        for(int i=0;i<=T0.cnt;i++)T0.tr[i][0]=T0.tr[i][1]=0,T0.ed.clear();T0.cnt=0;
        for(int i=0;i<=T1.cnt;i++)T1.tr[i][0]=T1.tr[i][1]=0,T1.ed.clear();T1.cnt=0;
    }
    return 0;
}

2024/7/7 07:44
加载中...