There is a tree with n nodes. For each node, there is an integer value ai, (1≤ai≤1,000,000,000 for 1≤i≤n). There is q queries which are described as follow: Assume the value on the path from node a to node bis t0,t1,⋯tm. You are supposed to calculate t0 xor tk xor t2k xor ... xor tpk (pk≤m).
Input Format
There are multi datasets. (∑n≤50,000,∑q≤500,000).
For each dataset: In the first n−1 lines, there are two integers u,v, indicates there is an edge connect node u and node v.
In the next n lines, There is an integer ai (1≤ai≤1,000,000,000).
In the next q lines, There is three integers a,b and k. (1≤a,b,k≤n).
Output Format
For each query, output an integer in one line, without any additional space.
样例输入
5 6 1 5 4 1 2 1 3 2 19 26 0 8 17 5 5 1 1 3 2 3 2 1 5 4 2 3 4 4 1 4 5
样例输出
17 19 26 25 019
让你求 u v上的 第0,k,2k,3k 点的异或和
暴力异或 我的代码要加输入挂。。估计写丑了
#include <bits/stdc++.h> using namespace std; const int N = 50010; vector<int> e[N]; int vis[N]; int dep[N]; int du[N]; int f[N][20]; int a[N]; int xr[N]; namespace fastIO { #define BUF_SIZE 100000 //fread -> read bool IOerror = 0; inline char nc() { static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE; if(p1 == pend) { p1 = buf; pend = buf + fread(buf, 1, BUF_SIZE, stdin); if(pend == p1) { IOerror = 1; return -1; } } return *p1++; } inline bool blank(char ch) { return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t'; } inline void read(int &x) { char ch; while(blank(ch = nc())); if(IOerror) return; for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0'); } #undef BUF_SIZE }; using namespace fastIO; void dfs(int u,int v) { xr[u]=xr[v]^a[u]; for(int i=0;i<e[u].size();i++) { if(e[u][i]==v) continue; dep[e[u][i]]=dep[u]+1; f[e[u][i]][0]=u; dfs(e[u][i],u); } } int n; void ST() { for(int j=1;(1<<j)<=n;j++) { for(int i=1;i<=n;i++) { if(f[i][j-1]!=-1) { f[i][j]=f[f[i][j-1]][j-1]; } } } } int lca(int x,int y) { if(dep[x]<dep[y]) swap(x,y); int t=dep[x]-dep[y]; for(int i=0;i<=17;i++) if((1<<i)&t) x=f[x][i]; if(x==y) return x; for(int i=17;i>=0;i--) { if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; } if(x==y) return x; return f[x][0]; } int num[30]; int main() { int q; while(read(n),read(q), !IOerror) { memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) e[i].clear(); for(int i=1;i<n;i++) { int u,v; read(u),read(v); e[u].push_back(v); e[v].push_back(u); } for(int i=1;i<=n;i++) read(a[i]); dep[1]=1; dfs(1,0); ST(); while(q--) { int x,y,k; read(x),read(y),read(k); if(k==1) { int lc=lca(x,y); printf("%d\n",xr[x]^xr[y]^a[lc] ); continue; } vector<int> rr; int lc=lca(x,y); int sum=0; sum^=a[x]; int kk=k,cnt=0; while(kk) { if(kk%2) num[cnt]=1; else num[cnt]=0; kk>>=1; cnt++; } while(1) { int ww=x; int flag=0; for(int i=0;i<cnt;i++) if(num[i]) ww=f[ww][i]; if(dep[ww]<dep[lc]) break; x=ww; sum^=a[x]; } int len=dep[x]-dep[lc]; int len1=(dep[y]-dep[lc]-(k-len))%k; if(dep[y]+len1<=dep[lc]||len1<0) { printf("%d\n",sum ); continue; } for(int i=0;i<=cnt;i++) if((1<<i)&len1) y=f[y][i]; sum^=a[y]; while(1) { int ww=y; int flag=0; for(int i=0;i<cnt;i++) { if(num[i]) ww=f[ww][i]; } if(dep[ww]<=dep[lc]) break; y=ww; sum^=a[y]; } printf("%d\n",sum ); } } }