原题:
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 }