1 条题解

  • 3
    @ 2023-7-26 18:52:45

    image

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=500005;
    int n,m,k,s,t,w[N],de[N],f[N][20],log2n,dis[N];
    int num[10000005],ans[N];
    vector<int> e[N];
    struct node{
    	int val,id,o;
    };
    vector<node> q[N];
    int lca(int u,int v){
    	if (de[u]<de[v]) swap(u,v);
    	for (int i=0,o=de[u]-de[v];o;++i,o>>=1)
    		if (o&1) u=f[u][i];
    	if (u==v) return u;
    	for (int j=log2n;j>=0;--j)
    		if (f[u][j]!=f[v][j]) u=f[u][j],v=f[v][j];
    	return f[u][0];
    }
    void dfs(int u){
    	for (int &v:e[u]){
    		if (v==f[u][0]) continue;
    		de[v]=de[u]+1;
    		dis[v]=w[v]^dis[u];
    		f[v][0]=u;
    		dfs(v);
    	}
    }
    void dfs1(int u){
    	num[w[u]]++;
    	for (auto &i:q[u]){
    		ans[i.id]+=i.o*num[i.val];	
    	}
    	for (int &v:e[u]){
    		if (v==f[u][0]) continue;
    		dfs1(v);
    	}
    	num[w[u]]--;
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);cout.tie(0);
    	cin>>n>>m;
    	for (int i=1;i<=n;++i) cin>>w[i];
    	for (int i=1;i<n;++i){
    		cin>>s>>t;
    		e[s].push_back(t);
    		e[t].push_back(s);
    	} 
    	dis[1]=w[1];
    	dfs(1);
    	log2n=log2(n);
    	for (int j=1;j<=log2n;++j)
    		for (int i=1;i<=n;++i)
    			f[i][j]=f[f[i][j-1]][j-1];
    	int u,v,p,val;
    	for (int i=1;i<=m;++i){
    		cin>>u>>v>>k;
    		p=lca(u,v);
    		val=dis[u]^dis[v]^w[p]^k;
    		if (val<=1e7){//不超过1e7 才进行查询,防止数组越界 
    			q[u].push_back({val,i,1});
    			q[v].push_back({val,i,1});
    			q[f[p][0]].push_back({val,i,-2});
    		}
    	}
    	dfs1(1);
    	for (int i=1;i<=m;++i)
    		cout<<(ans[i]?"YES":"NO")<<"\n";
    }
    
    
    
    • 1

    [传智杯 #4 决赛] [yLOI2021] 生活在树上(hard version)

    信息

    ID
    344
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    68
    已通过
    21
    上传者