【洛谷2420】让我们异或吧

原题:

 n<=1e5

这题简单,求出树上异或前缀和,每次询问时找出lca就行了

but,实际上根本不用求lca想过么

直接把询问的两个点的树上异或前缀和异或起来就vans了,根到lca上的边会异或两次,自动抵消

异或的性质还值得引起注意的呀

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 struct edg{int y,nxt,z;}e[210000];  int lk[110000],ltp=0;
 5 void ist(int x,int y,int z){
 6     e[++ltp]=(edg){y,lk[x],z};  lk[x]=ltp;
 7     e[++ltp]=(edg){x,lk[y],z};  lk[y]=ltp;
 8 }
 9 int n,m;
10 int f[110000];
11 void dfs(int x,int y){
12     for(int i=lk[x];i;i=e[i].nxt)if(e[i].y!=y){
13         f[e[i].y]=f[x]^e[i].z;
14         dfs(e[i].y,x);
15     }
16 }
17 int main(){
18     cin>>n;
19     int l,r,v;
20     for(int i=1;i<n;++i){
21         scanf("%d%d%d",&l,&r,&v);
22         ist(l,r,v);
23     }
24     dfs(1,0);
25     cin>>m;
26     while(m --> 0){
27         scanf("%d%d",&l,&r);
28         printf("%d
",f[l]^f[r]);
29     }
30     return 0;
31 }
View Code
原文地址:https://www.cnblogs.com/cdcq/p/12294026.html