题目链接:让我们异或吧

题目描述

异或是一种神奇的运算,大部分人把它总结成不进位加法.

在生活中…xor运算也很常见。比如,对于一个问题的回答,是为1,否为0.那么:

(A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣

好了,现在我们来制造和处理一些复杂的情况。比如我们将给出一颗树,它很高兴自己有N个结点。树的每条边上有一个权值。我们要进行M次询问,对于每次询问,我们想知道某两点之间的路径上所有边权的异或值。

输入输出格式

输入格式:

输入文件第一行包含一个整数N,表示这颗开心的树拥有的结点数,以下有N-1行,描述这些边,每行有3个数,u,v,w,表示u和v之间有一条权值为w的边。接下来一行有一个整数M,表示询问数。之后的M行,每行两个数u,v,表示询问这两个点之间的路径上的权值异或值。

输出格式:

输出M行,每行一个整数,表示异或值

输入输出样例

输入样例#1:

  1. 5
  2. 1 4 9644
  3. 2 5 15004
  4. 3 1 14635
  5. 5 3 9684
  6. 3
  7. 2 4
  8. 5 4
  9. 1 1
输出样例#1:

  1. 975
  2. 14675
  3. 0

说明

对于40%的数据,有1 ≤ N,M ≤ 3000;

对于100%的数据,有1 ≤ N ,M≤ 100000。

咋一看以为是树剖,于是还没想清楚就开始打了....

然后打到一半,突然想到题目给出的权值是边上的权值,顿时懵逼...

其实这道题也是可以用lca来做的,两个点一起向上跳,并在过程中统计经过边的权值,跳到lca的地方就停下来.但是这样会非常的麻烦.所以我们想一下要怎么将这个简化.

首先异或具有这样的性质:

  • a ^ b = b ^ a
  • a ^ b ^ c = a ^ (b ^ c)
  • a ^ a = 0

我们假设询问的两个点分别为a , b,那么算a , b之间的路程也就是a -> lca , b -> lca.然后我们把路程稍微转换一下,变成a ->  lca -> root , root -> lca -> b.这样我们在lca与根节点中就走了两遍,因为异或的性质,所以走两遍得到的权值等于0.也就是这样得到的结果对答案不会产生影响.所以我们直接一遍深搜记录每个节点到根节点的路径长度,询问时直接将这两个值异或起来就是答案.

思路比较简单,注释就免了吧.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=+;
  4.  
  5. int n;
  6. int cnt = ;
  7. int root = ;
  8. int dep[N], len[N];
  9. int last[N], size[N];
  10.  
  11. struct edge{
  12. int to, next, w;
  13. }e[N*];
  14.  
  15. int gi(){
  16. int ans = , f = ; char i = getchar();
  17. while(i<''||i>''){if(i=='-')f=-;i=getchar();}
  18. while(i>=''&&i<=''){ans=ans*+i-'';i=getchar();}
  19. return ans * f;
  20. }
  21.  
  22. void add(int x,int y,int z){
  23. e[++cnt].to = y;
  24. e[cnt].w = z;
  25. e[cnt].next = last[x];
  26. last[x] = cnt;
  27. }
  28.  
  29. void dfs(int x,int deep,int fa){
  30. dep[x] = deep;
  31. for(int i=last[x];i;i=e[i].next){
  32. int to = e[i].to;
  33. if(to != fa){
  34. len[to] = len[x]^e[i].w;
  35. dfs(to,deep+,x);
  36. }
  37. }
  38. }
  39.  
  40. int main(){
  41. int x, y, z, m; n = gi();
  42. for(int i=;i<=n;i++) size[i] = ;
  43. for(int i=;i<n;i++){
  44. x = gi(); y = gi(); z = gi();
  45. add(x,y,z); add(y,x,z);
  46. }
  47. dfs(,,-); m = gi();
  48. for(int i=;i<=m;i++){
  49. x = gi(); y = gi();
  50. printf("%d\n",len[x]^len[y]);
  51. }
  52. return ;
  53. }

[洛谷P2420] 让我们异或吧的更多相关文章

  1. 洛谷 P2420 让我们异或吧 解题报告

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  2. 洛谷——P2420 让我们异或吧

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  3. 洛谷 [P2420] 让我们异或吧

    某两点之间的路径上所有边权的异或值即dis1^dis2--^disn. 由于x^y^y=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv. #include & ...

  4. 洛谷P2420 让我们异或吧(树链剖分)

    题目描述异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能够 ...

  5. ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】

    题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...

  6. 【洛谷P2420】让我们异或吧

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...

  7. AC日记——让我们异或吧 洛谷 P2420

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...

  8. skkyk:题解 洛谷P2420 【让我们异或吧】lca+xor前缀和

    刚学了LCA,写篇题解巩固一下 首先题目有误: (A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣,这句话显然是错误的qwq 对于这道题,容易看出,对于待处理的两个点,只要我们找到他的 ...

  9. 洛谷P4551 最长异或路径

    传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做 ...

随机推荐

  1. nginx 负载均衡 反向代理

    nginx 通过方向代理实现负载均衡,负载均衡是大流量网站要做的措施,单从字面上的意思来理解为N台服务器平均分担负载,不会因为某一台服务器负载高宕机而影响用户访问网站,负载均衡至少需要三台服务器, 既 ...

  2. 获取.jar文件运行时所处的路径

    在Windows控制台中运行.jar文件时的两种环境: (1)控制台当前所在目录是.jar文件所在的目录 (2)控制台当前所在目录不是.jar文件所在的目录 我的期望: 我希望在上述两种环境下均可以得 ...

  3. LeetCode 876——链表的中间结点

    1. 题目 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形 ...

  4. 启动 SQL Server 管理 Studio 在 SQL Server 2008R2 中的错误消息:"无法读取此系统上以前注册的服务器的列表" 解决方法

    问题: 服务器被人直接停掉,重启后,发现sqlserver2008r2 启动管理器报错: "无法读取此系统上以前注册的服务器的列表" 如图: 点击继续,进入后: 解决方法: 点击上 ...

  5. Week2 Teamework from Z.XML 软件分析与用户需求调查(三)必应助手体验评测

    评测人:毛宇 肖俊鹏 说明:言辞激烈,请勿介意 我花了2天的时间来试用这个软件<必应缤纷桌面手机助手>,有了很多体会,这里,我来谈一下这款软件在体验部分的表现情况. 体验部分主要分为三个部 ...

  6. laravel 学习随笔(一)

    1.路由参数:路由参数总是通过花括号进行包裹,参数在路由被执行时会被传递到路由的闭包.(路由参数不能包含“-”字符,如有需要可以用“_”代替):

  7. C - 安装雷达

    C - 安装雷达 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem Descr ...

  8. 【Linux】Linux修改openfiles后不生效问题?

    #次故障问题环境背景: Centos7.4物理机,升级过ssh和ntp: #一般只需要在此文件后面添加4行就行,配置后即可生效(exit再次登录即可生效),此次配置后没生效,reboot还是没生效,在 ...

  9. Web-request内置对象在JSP编程中的应用

  10. HashSet如何判定两个元素相同

    在介绍java的集合时,我们提到,set是一个"罐子".我们可以向其中放入各式各样的元素,这些元素没有顺序,但不能相同.其中,HashSet是最常用的一个实现类. 首先,我们看下H ...