西安网络赛 xor
来源:互联网 发布:易语言砍价源码 编辑:程序博客网 时间:2024/06/11 21:10
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 61 54 12 13 2192608175 5 11 3 23 2 15 4 23 4 41 4 5
样例输出
17192625019
让你求 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 ); } }}
- 西安网络赛 xor
- 2017 ACM西安网络赛 G题 Xor
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Xor
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G Xor lca+暴力
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor [LCA+分块]
- 2017 ACM-ICPC西安赛区网络赛 Xor【根号分治、倍增lca】
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 G. Xor
- [2014 西安网络赛]
- 西安赛区网络赛
- 西安网络赛 经验总结
- 2014网络赛 西安赛区
- 2014西安赛区网络赛
- 西安网络赛e题
- 2017西安网络赛C_SUM
- 2017西安网络赛B_Coin
- acm_icpc网络赛第三站:西安赛区
- 2014 西安赛区网络赛 5012Dice
- Elasticsearch分布式安装错误之:handshack failed
- Hibernate持久化类要求
- 2011年NOIP提高组 铺地毯
- [BZOJ1029][JSOI2007]建筑抢修-堆-贪心
- Java教程
- 西安网络赛 xor
- 排序算法入门学习笔记
- Java代理模式
- Unity学习之输入与控制
- Android 自定义控件 ---DecorativeListView
- maven项目开发环境搭建之一环境变量
- 理解for循环,到底循环了什么?
- Hibernate学习---第一节:hibernate配置和入门程序
- Jenkins自动化测试