【洛谷P2420】让我们异或吧
题目描述
异或是一种神奇的运算,大部分人把它总结成不进位加法.
在生活中…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:
5
1 4 9644
2 5 15004
3 1 14635
5 3 9684
3
2 4
5 4
1 1
输出样例#1:
975
14675
0
说明
对于40%的数据,有1 ≤ N,M ≤ 3000;
对于100%的数据,有1 ≤ N ,M≤ 100000。
算法:
LCA+数学
分析:
这道题乍眼一看感觉是带权值的最近公共祖先问题,但粗略计算后发现会超时,进一步分析,得到一些有关异或的规律,然后这就是一道暴力的题目。
引用一些大佬的资料:
根据题目中对“异或”的定义,我们可以得出异或的真值表,这里我们用a,b代表异或的两个元素,a^b代表a按位异或的值。
a b a^b
0
0
0
0
1
1
1
0
1
1
1
0
我们发现,如果a==b,那么a^b就是0,否则式子的值就是1。
通过真值表,我们可以发现并证明异或的几个性质。
1.a^b==b^a
异或具有交换律
a b a^b b^a
0
0
0
0
0
1
1
1
1
0
1
1
1
1
0
0
2.a^b^c==a^(b^c)
异或具有结合律
a b c a^b^c a^(b^c)
0
0
0
0
0
0
0
1
1
1
0
1
0
1
1
0
1
1
0
0
1
0
0
1
1
1
0
1
0
0
1
1
0
0
0
1
1
1
1
1
3.a^a==0
异或自己是0
a a^a
0
0
1
0
4.a^0=a
异或0还是0
a a^
0
0
0
1
1
由以上四点性质,我们可以推出:
a^b^b = a^(b^b)
= a^0
= a
所以推出如下定理:
异或的逆运算是它本身!!!
讲一下对于本题的具体思路:对于这棵树,随意指定一个根节点,以此点来建树,维护每个点到根节点的距离,两个点u到v的树上路径一定为
u->lca(u,v)->v
第一个过程一定是一直向父亲节点前进,第二个过程一定是一直向儿子节点前进。
(lca(u,v)的定义为u,v的树上最近公共祖先)
那么最后查询的答案一定为
length[u]^length[v] anc^ length[lca(u,v)] anc^ length[lca(u,v)]
其中anc^为^的逆运算,由于之前已经推出anc^等价于^,而两次亦或的结果等价于原结果,所以最后的答案为:
length[u]^length[v]
此处不用考虑特判u或v是根节点的情况。
建树的时间复杂度为O(N),查询只需要O(1)的时间,最后程序的时间复杂度为O(N+M),空间复杂度为O(N)。
上代码:
#include<cstdio>
#define maxn 100010
using namespace std; int n,m,tot,head[maxn],dis[maxn];
struct node
{
int nxt,to,val;
}edge[maxn<<];
bool vis[maxn]; int read()
{
int x=,f=;
char c=getchar();
while (c<||c>)
f=c=='-'?-:,c=getchar();
while (c>=&&c<=)
x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
} void add(int c,int b,int a)
{
edge[++tot]=(node){head[a],b,c};
head[a]=tot;
edge[++tot]=(node){head[b],a,c};
head[b]=tot;
} int dfs(int u,int Xor)
{
dis[u]=Xor;
vis[u]=;
for (int i=head[u];i;i=edge[i].nxt)
if (!vis[edge[i].to])
dfs(edge[i].to,Xor^edge[i].val);
} int main()
{
int i,j,k,u,v;
n=read();
for (i=;i<=n-;i++)
add(read(),read(),read());
m=read();
dfs(,);
while (m--)
printf("%d\n",dis[read()]^dis[read()]);
return ;
}
【洛谷P2420】让我们异或吧的更多相关文章
- 洛谷 P2420 让我们异或吧 解题报告
P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...
- 洛谷——P2420 让我们异或吧
P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...
- 洛谷 [P2420] 让我们异或吧
某两点之间的路径上所有边权的异或值即dis1^dis2--^disn. 由于x^y^y=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv. #include & ...
- 洛谷P2420 让我们异或吧(树链剖分)
题目描述异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能够 ...
- [洛谷P2420] 让我们异或吧
题目链接:让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是 ...
- ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】
题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...
- AC日记——让我们异或吧 洛谷 P2420
题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...
- skkyk:题解 洛谷P2420 【让我们异或吧】lca+xor前缀和
刚学了LCA,写篇题解巩固一下 首先题目有误: (A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣,这句话显然是错误的qwq 对于这道题,容易看出,对于待处理的两个点,只要我们找到他的 ...
- 洛谷P4551 最长异或路径
传送门:https://www.luogu.org/problem/show?pid=4551 在看这道题之前,我们应懂这道题怎么做:给定n个数和一个数m,求m和哪一个数的异或值最大. 一种很不错的做 ...
随机推荐
- LeetCode-51.N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解 ...
- kali linux 安装Nessus
Nessus 介绍: Nessus 是目前全世界最多人使用的系统漏洞扫描与分析软件.总共有超过75,000个机构使用Nessus 作为扫描该机构电脑系统的软件. 下载Nessus,我的是64为,我选择 ...
- [2017BUAA软工助教]剩余个人作业与deadline
软件工程剩余作业与deadline 标签(空格分隔): 软件工程 一.个人阅读作业+总结 对软件工程的学习做一个总结. 阅读下列关于软件开发本质和开发方法的博客/文章,结合自己在个人项目/结对编程/团 ...
- 在centOS中安装mongodb
自己在一个CentOS6.6的系统中按照官网的说明,走了一遍的安装过程,记录一下. 看过个mongo的视频,上面介绍的安装是用源码安装,而官网上说需要gcc4.8.3的版本,还有scons的编译工具, ...
- C#Dictionary使用记录
一.区别 在工作中经常遇到C#数组.ArrayList.List.Dictionary存取数据,其区别和优劣势为: 初始化 数组: int[] buff = new int[6]; ArrayList ...
- Scapy安装以及简单使用
Scapy安装以及简单使用 参考文档 scapy官方文档 前言 scapy是一个可以模拟发送报文的python程序,使用了它从此发包不愁. 安装 1.首先得安装Python2.7 在linux系统 ...
- kickstart自动化安装
preboot execute environment预启动执行环境--intel开发的技术,计算机可以通过pxe协议从网络引导启动. 工作模式为客户端/服务器端的c/s模式 客户端从远端服务器下载镜 ...
- Alpha 冲刺九
团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 完善各自部分 项目描 ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量
大家在中学就已经学过变量的概念了.例如:我们令 x = 100,则可以推出 x*2 = 200 试试下面这段 Python 代码 import turtle turtle.shape("tu ...
- 解决sublime text3下中文无法输入的问题(Ubuntu)
sublime-text-imfix,非常无脑.就喜欢这样的.