本题的树上操作异或值,根据异或的性质我们可以直接dfs根节点到每个点的异或值,而在求u到v的异或值时直接dfs[u]^dfs[v],重复的部分就会抵消。
如果是加法我们就会需要求lca 然后u+v-lca(u,v)*2+点lca(u,v)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e6 + 10;
int n, m, head[maxn], dis[maxn], vis[maxn];
int cnt = 0;
//链式前向星
struct edge {
int to, next;
int w;
}e[maxn];
void add(int u, int v, int w) {
e[++cnt].to = v;
e[cnt].next = head[u];
e[cnt].w = w;
head[u] = cnt;
}
void dfs(int nu, int w) {
dis[nu] = w; vis[nu] = true;
for (int i = head[nu]; i; i = e[i].next)
if (!vis[e[i].to])
dfs(e[i].to, w ^ e[i].w);
}
int main()
{
scanf("%d", &n);
for (int i = 1; i < n; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w); add(v, u, w);
}
dfs(1, 0);
cin>>m;
for (int i = 1; i <= m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
printf("%d\n", dis[u] ^ dis[v]);
}
return 0;
}