xor

There is a tree with nn nodes. For each node, there is an integer value a_ia​i​​, (1 \le a_i \le 1,000,000,0001≤a​i​​≤1,000,000,000 for 1 \le i \le n1≤i≤n). There is qq queries which are described as follow: Assume the value on the path from node aa to node bb is t_0, t_1, \cdots t_mt​0​​,t​1​​,⋯t​m​​. You are supposed to calculate t_0t​0​​ xor t_kt​k​​ xor t_{2k}t​2k​​ xor ... xor t_{pk}t​pk​​ (pk \le m)(pk≤m).

Input Format

There are multi datasets. (\sum n \le 50,000, \sum q \le 500,000)(∑n≤50,000,∑q≤500,000).

For each dataset: In the first n-1n−1 lines, there are two integers u,vu,v, indicates there is an edge connect node uuand node vv.

In the next nn lines, There is an integer a_ia​i​​ (1 \le a_i \le 1,000,000,0001≤a​i​​≤1,000,000,000).

In the next qq lines, There is three integers a,ba,b and kk. (1 \le a,b,k \le n1≤a,b,k≤n).

Output Format

For each query, output an integer in one line, without any additional space.

样例输入

  1. 5 6
  2. 1 5
  3. 4 1
  4. 2 1
  5. 3 2
  6. 19
  7. 26
  8. 0
  9. 8
  10. 17
  11. 5 5 1
  12. 1 3 2
  13. 3 2 1
  14. 5 4 2
  15. 3 4 4
  16. 1 4 5

样例输出

  1. 17
  2. 19
  3. 26
  4. 25
  5. 0
  6. 19

题目来源

2017 ACM-ICPC 亚洲区(西安赛区)网络赛

【题意】给您一棵树,每个节点有一个权值,q次询问,每次给出u,v,k,求从u到v的路径中,从u开始,每隔k个节点亦或一下的结果。

【分析】根号分治,大于根号n的暴力跳(倍增跳),小于根号n的用数组存起来,复杂度最高为O(N)*sqrt(N)*log(N).

  1. #include <bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. #define met(a,b) memset(a,b,sizeof a)
  4. #define pb push_back
  5. #define mp make_pair
  6. #define rep(i,l,r) for(int i=(l);i<=(r);++i)
  7. #define inf 0x3f3f3f3f
  8. using namespace std;
  9. typedef long long ll;
  10. const int N = 5e4+;;
  11. const int M = ;
  12. const int mod = ;
  13. const int mo=;
  14. const double pi= acos(-1.0);
  15. typedef pair<int,int>pii;
  16. int n,q,sz;
  17. int a[N],fa[N][],up[N][M+],dep[N];
  18. vector<int>edg[N],vec;
  19. int find(int u,int k){
  20. for(int i=;i>=;i--){
  21. if(k>>i&){
  22. u=fa[u][i];
  23. if(u==)return ;
  24. }
  25. }
  26. return u;
  27. }
  28. void dfs(int u,int f){
  29. fa[u][]=f;
  30. for(int i=;i<;i++){
  31. fa[u][i]=fa[fa[u][i-]][i-];
  32. }
  33. for(int i=;i<=sz;i++){
  34. up[u][i]=a[u];
  35. int v=find(u,i);
  36. up[u][i]^=up[v][i];
  37. }
  38. for(int i=;i<edg[u].size();i++){
  39. int v=edg[u][i];
  40. if(v==f)continue;
  41. dep[v]=dep[u]+;
  42. dfs(v,u);
  43. }
  44. }
  45. int LCA(int u,int v){
  46. int U=u,V=v;
  47. if(dep[u]<dep[v])swap(u,v);
  48. for(int i=;i>=;i--){
  49. if(dep[fa[u][i]]>=dep[v]){
  50. u=fa[u][i];
  51. }
  52. }
  53. if(u==v)return (u);
  54. for(int i=;i>=;i--){
  55. if(fa[u][i]!=fa[v][i]){
  56. u=fa[u][i];v=fa[v][i];
  57. }
  58. }
  59. return (fa[u][]);
  60. }
  61. int solve(int u,int v,int k,int lca){
  62. int res=(dep[u]+dep[v]-*dep[lca])%k;
  63. int U=u,V=v;
  64. v=find(v,res);
  65. int ans=;
  66. while(dep[u]>=dep[lca]){
  67. ans^=a[u];
  68. u=find(u,k);
  69. if(!u)break;
  70. }
  71. if(V==lca||dep[v]<=dep[lca]||v==)return ans;
  72. V=v;
  73. while(dep[v]>=dep[lca]){
  74. ans^=a[v];
  75. v=find(v,k);
  76. if(!v)break;
  77. }
  78. if((dep[U]-dep[lca])%k==&&(dep[V]-dep[lca])%k==)ans^=a[lca];
  79. return ans;
  80. }
  81. void init(){
  82. met(fa,);met(up,);
  83. for(int i=;i<N;i++){
  84. edg[i].clear();
  85. }
  86. }
  87. int main(){
  88. while(~scanf("%d%d",&n,&q)){
  89. init();
  90. sz=round(sqrt(n));
  91. for(int i=,u,v;i<n;i++){
  92. scanf("%d%d",&u,&v);
  93. edg[u].pb(v);edg[v].pb(u);
  94. }
  95. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  96. dep[]=;
  97. dfs(,);
  98. while(q--){
  99. int u,v,k;
  100. scanf("%d%d%d",&u,&v,&k);
  101. int lca=LCA(u,v),ans=;;
  102. if(k>sz){
  103. ans=solve(u,v,k,lca);
  104. }
  105. else {
  106. int dis=dep[u]-dep[lca];
  107. int s=(dis/k+)*k;
  108. int x=find(u,s);
  109. ans=up[u][k]^up[x][k];
  110. int res=(dep[u]+dep[v]-*dep[lca])%k;
  111. if(lca!=v&&dep[v]-dep[lca]>res){
  112. v=find(v,res);
  113. dis=dep[v]-dep[lca];
  114. s=(dis/k+)*k;
  115. x=find(v,s);
  116. ans^=up[v][k]^up[x][k];
  117. if((dep[u]-dep[lca])%k==&&(dep[v]-dep[lca])%k==)ans^=a[lca];
  118. }
  119. }
  120. printf("%d\n",ans);
  121. }
  122. }
  123. return ;
  124. }

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)的更多相关文章

  1. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  2. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

  3. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  4. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  5. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)

    参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...

  6. [刷题]ACM/ICPC 2016北京赛站网络赛 第1题 第3题

    第一次玩ACM...有点小紧张小兴奋.这题目好难啊,只是网赛就这么难...只把最简单的两题做出来了. 题目1: 代码: //#define _ACM_ #include<iostream> ...

  7. 2017 ACM/ICPC(西安)赛后总结

    早上8:00的高铁,所以不得不6点前起床,向火车站赶……到达西安后已经是中午,西工大距离西安北站大概3小时车程的距离,只好先解决午饭再赶路了……下午3.30的热身赛,一行人在3.35左右赶到了赛场,坐 ...

  8. 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit    1000 ms Memory li ...

  9. 2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

    鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Fo ...

  10. [刷题]ACM ICPC 2016北京赛站网络赛 D - Pick Your Players

    Description You are the manager of a small soccer team. After seeing the shameless behavior of your ...

随机推荐

  1. CF839 D 容斥

    求$gcd>1$的所有$gcd(a_i,a_{i+1}…a_{n})*(n-i+1)$的和 首先先标记所有出现的数.从高到低枚举一个数k,记录它的倍数出现次数cnt,那么当前所有组合的答案就是$ ...

  2. LightOJ 1065 - Number Sequence 矩阵快速幂水题

    http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...

  3. dubbo可通过指定Url方式绕过注册中心直连指定的服务地址

    开发.测试环境可通过指定Url方式绕过注册中心直连指定的服务地址,避免注册中心中服务过多,启动建立连接时间过长,如: <dubbo:reference id="providerServ ...

  4. Linux rpm yum 等安装软件

    任何程序都是先写代码,拿到源码去编译得到一个目标程序. 1  编译的过程复杂有需要准备编译的环境,和硬件有关,32位64位,内核的不同等等所以需要编译多次     Java特殊但是他需要安装jvm, ...

  5. Map集合的两种取出方式

    Map集合有两种取出方式, 1.keySet:将Map中的键存入Set集合,利用set的迭代器来处理所有的键 举例代码如下: import java.util.*; class Test { publ ...

  6. BestCoder Round #41 记。

    大概整个过程都是很绝望的吧. 发现自己在七点之前是肯定搞不定网了..有冲动跑到机房去打 但是又不喜欢那样的气氛 这可是shi的场呢...好难过啊... 后来..好像是在和lyd讨论怎么把网络复原的过程 ...

  7. mysql跨节点join——federated引擎

    一. 什么是federated引擎 mysql中的federated类似于oracle中的dblink. federated是一个专门针对远程数据库的实现,一般情况下在本地数据库中建表会在数据库目录中 ...

  8. html 中的列表

    html 中列表可以分为 1.  无序列表(ul--li 的形式) 2.  有序列表(ol li的形式) 3.  定义列表(dl 的形式) 下面来看几种列表的具体内容: 1.无序列表. 无序列表的格式 ...

  9. 设计模式之Adapter

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: 将两个不兼容的类纠合在一起使用,属于结构型模式,也有人称它为wrapper(包装类). 包装类 ...

  10. SQLite3数据库的操作

    数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件. 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中. 打开数据 ...