题意:给一棵树,每条边有一个权值,求满足u到v的路径上的异或和为s的(u,v)点对数

思路:计a到b的异或和为f(a,b),则f(a,b)=f(a,root)^f(b,root)。考虑dfs,一边计算当前点到根的f值,用一个数组记录当前遍历过的点中到根的异或值为i的点的个数,那么答案可以O(1)算出来,更新也是O(1)的。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119
  120. 120
  121. 121
  122. 122
  123. 123
  124. 124
  125. 125
  126. 126
  127. 127
  128. 128
  129. 129
  1. #pragma comment(linker, "/STACK:10240000")
  2. #include <map>
  3. #include <set>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <deque>
  7. #include <queue>
  8. #include <stack>
  9. #include <vector>
  10. #include <cstdio>
  11. #include <string>
  12. #include <cstdlib>
  13. #include <cstring>
  14. #include <iostream>
  15. #include <algorithm>
  16.  
  17. using namespace std;
  18.  
  19. #define X first
  20. #define Y second
  21. #define pb push_back
  22. #define mp make_pair
  23. #define all(a) (a).begin(), (a).end()
  24. #define fillchar(a, x) memset(a, x, sizeof(a))
  25. #define copy(a, b) memcpy(a, b, sizeof(a))
  26.  
  27. typedef long long ll;
  28. typedef pair<int, int> pii;
  29. typedef unsigned long long ull;
  30.  
  31. #ifndef ONLINE_JUDGE
  32. void RI(vector<int>&a,int n){a.resize(n);for(int i=;i<n;i++)scanf("%d",&a[i]);}
  33. void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>
  34. void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?:-;
  35. while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>
  36. void print(const T t){cout<<t<<endl;}template<typename F,typename...R>
  37. void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>
  38. void print(T*p, T*q){int d=p<q?:-;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}
  39. #endif
  40. template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
  41. template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}
  42.  
  43. const double PI = acos(-1.0);
  44. const int INF = 1e9 + ;
  45. const double EPS = 1e-12;
  46.  
  47. /* -------------------------------------------------------------------------------- */
  48.  
  49. const int maxn = 2e5 + ;
  50.  
  51. struct Graph {
  52. vector<vector<int> > G;
  53. void clear() { G.clear(); }
  54. void resize(int n) { G.resize(n + ); }
  55. void add(int u, int v) { G[u].push_back(v); }
  56. vector<int> & operator [] (int u) { return G[u]; }
  57. };
  58. Graph G;
  59.  
  60. struct Edge {
  61. int u, v, w;
  62. Edge(int u, int v, int w) {
  63. this->u = u;
  64. this->v = v;
  65. this->w = w;
  66. }
  67. };
  68. vector<Edge> E;
  69.  
  70. bool vis[maxn];
  71. int cnt[maxn];
  72. int Q[];
  73. ll ans[];
  74. int q, now;
  75.  
  76. void add(int u, int v, int w) {
  77. E.pb(Edge(u, v, w));
  78. G.add(u, E.size() - );
  79. }
  80.  
  81. void dfs(int u) {
  82. cnt[now] ++;
  83. for (int i = ; i < q; i ++) {
  84. ans[i] += cnt[now ^ Q[i]];
  85. }
  86. vis[u] = true;
  87. for (int i = ; i < G[u].size(); i ++) {
  88. Edge e = E[G[u][i]];
  89. if (!vis[e.v]) {
  90. now ^= e.w;
  91. dfs(e.v);
  92. now ^= e.w;
  93. }
  94. }
  95. }
  96.  
  97. int main() {
  98. #ifndef ONLINE_JUDGE
  99. freopen("in.txt", "r", stdin);
  100. //freopen("out.txt", "w", stdout);
  101. #endif // ONLINE_JUDGE
  102. int T, n;
  103. cin >> T;
  104. while (T --) {
  105. cin >> n;
  106. E.clear();
  107. G.clear();
  108. G.resize(n);
  109. for (int i = ; i < n; i ++) {
  110. int u, v, w;
  111. scanf("%d%d%d", &u, &v, &w);
  112. add(u, v, w);
  113. add(v, u, w);
  114. }
  115. cin >> q;
  116. for (int i = ; i < q; i ++) {
  117. scanf("%d", Q + i);
  118. }
  119. fillchar(vis, );
  120. now = ;
  121. fillchar(cnt, );
  122. fillchar(ans, );
  123. dfs();
  124. for (int i = ; i < q; i ++) {
  125. cout << ans[i] << endl;
  126. }
  127. }
  128. return ;
  129. }

[hdu5416 CRB and Tree]树上路径异或和,dfs的更多相关文章

  1. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)

    题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...

  2. Codeforces 739B Alyona and a tree(树上路径倍增及差分)

    题目链接 Alyona and a tree 比较考验我思维的一道好题. 首先,做一遍DFS预处理出$t[i][j]$和$d[i][j]$.$t[i][j]$表示从第$i$个节点到离他第$2^{j}$ ...

  3. Count on a tree(树上路径第K小)

    题目链接:https://www.spoj.com/problems/COT/en/ 题意:求树上A,B两点路径上第K小的数 思路:主席树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表上. ...

  4. Hdu 5416 CRB and Tree (bfs)

    题目链接: Hdu 5416 CRB and Tree 题目描述: 给一棵树有n个节点,树上的每条边都有一个权值.f(u,v)代表从u到v路径上所有边权的异或值,问满足f(u,v)==m的(u, v) ...

  5. HDU 5416 CRB and Tree(前缀思想+DFS)

    CRB and Tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  6. HDU 5416——CRB and Tree——————【DFS搜树】

    CRB and Tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  7. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  8. 树上路径(path)

    树上路径(path) 题目描述 在Berland,有n个城堡. 每个城堡恰好属于一个领主.不同的城堡属于不同的领主.在所有领主中有一个是国王,其他的每个领主都直接隶属于另一位领主,并且间接隶属于国王. ...

  9. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

随机推荐

  1. Nginx知多少系列之(七)负载均衡策略

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.负载均衡策略 8.加权轮询(round rob ...

  2. python与excel的关系;铁打的python流水的excel

    现在很多行业,都离不开用Excel: 做财务的,要用Excel做报表:做物流的,会用Excel来跟踪订单情况:做HR的,会用Excel算工资:做分析的,会用Excel计算数据做报表.不知道你有没有这样 ...

  3. 华为鲲鹏服务器安装 k3s+rancher

    华为鲲鹏服务器安装 k3s+rancher 华为鲲鹏服务器 华为鲲鹏服务器采用华为自研cpu ARMv8架构,提供 Windows 和多个Linux 系统,作为服务器使用我一直使用Centos系统(不 ...

  4. 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD

    使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...

  5. sql注入 pikachu

    闭合条件的探测 数字型注入 burp抓包 分别测试 id=1 and 1=1和id=1 or 1=1 存在漏洞 字符型注入 ' 报错 探测闭合条件 ' order by 1# 未报错.构成闭合 同上有 ...

  6. [Qt] QProcess::startDetached() 避免弹窗,或者窗口一闪而过

    主动宣告setProcessState(QProcess::NotRunning)   或者在堆上new一个QProcess.     出处:  https://stackoverflow.com/q ...

  7. opencv-5-图像遍历与图像改变

    opencv-5-图像遍历与图像改变 opencvc++qt 目录 目录 开始 图像的像素点访问与遍历 opencv 座标定义 下标访问 指针访问 迭代器法访问 遍历访问时间对比 图像操作 图像叠加 ...

  8. WebLogic上的项目无法更新,删除项目缓存

    /root/bea/user_projects/domains/base_domain/servers/AdminServer/tmp/ /root/bea/user_projects/domains ...

  9. 一款被大厂选用的 Hexo 博客主题

    首先这是一篇自吹自擂的文章,主题是由多位非前端程序员共同开发,目前经过一年半的迭代已经到达 v1.8.0 版本,并且获得大量认可,甚至某大厂员工已经选用作为内部博客,因此我决定写这篇文章向更多人安利它 ...

  10. ps 和 top

    ps 进程和线程的关系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程. (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源. (3)处理机分给线程,即真正在处 ...