洛谷——P2420 让我们异或吧
P2420 让我们异或吧
题目描述
异或是一种神奇的运算,大部分人把它总结成不进位加法.
在生活中…xor运算也很常见。比如,对于一个问题的回答,是为1,否为0.那么:
(A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣
好了,现在我们来制造和处理一些复杂的情况。比如我们将给出一颗树,它很高兴自己有N个结点。树的每条边上有一个权值。我们要进行M次询问,对于每次询问,我们想知道某两点之间的路径上所有边权的异或值。
维护父节点的同时维护抑或值
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring> #define N 1010100
using namespace std; int n,m,head[N],tot;
struct nodE {
int to,next,w;
} e[N]; void add(int u,int v,int w) {
e[++tot].to=v,e[tot].next=head[u],head[u]=tot,e[tot].w=w;
} int p[N][],f[N][],dep[N];
void dfs(int u,int fa,int w) {
dep[u]=dep[fa]+,f[u][]=fa,p[u][]=w;
for(int i=; (<<i)<=dep[u]; i++)
f[u][i]=f[f[u][i-]][i-],p[u][i]=p[u][i-]^p[f[u][i-]][i-];
for(int i=head[u]; i; i=e[i].next) {
int v=e[i].to;
if(v==fa) continue;
dfs(v,u,e[i].w);
}
} int lca(int u,int v) {
int an=;
if(dep[u]>=dep[v]) swap(u,v);
for(int i=; i>=; i--) {
if(dep[u]<=dep[v]-(<<i)) {
if(!an) an=p[v][i];
else an^=p[v][i];
v=f[v][i];
}
}
if(u==v) return an;
for(int i=; i>=; i--) {
if(f[u][i]!=f[v][i]) {
if(!an) an=p[v][i]^p[u][i];
else an^=p[v][i],an^=p[u][i];
u=f[u][i],v=f[v][i];
}
}
if(v==) return an^p[u][];
else if(u==) return an^p[v][];
return an^p[u][]^p[v][];
} int main() {
scanf("%d",&n);
for(int u,v,w,i=; i<n; i++) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
dfs(,,);
scanf("%d",&m);
for(int u,v,i=; i<=m; i++) {
scanf("%d%d",&u,&v);
printf("%d\n",lca(u,v));
} return ;
}
普及一下有关抑或的知识:
抑或: $0^0=0,1^1=0,1^0=1,0^1=1$
观察发现只有二进制位相同时,那一位的抑或值才为真
抑或的几个常用性质:
1.交换律:$a\^b=b\^a$ 显然
2.结合律:$a\^b\^c=a\^(b\^c)$ 显然
3.抑或自己 $a\^a=0$ 显然
4.抑或0 $a\^0=a$ 显然
设$dis[u]$为节点1到$u$所经过路径上的抑或值
那么本题要求就是$(dis[u]^dis[lca(u,v)])^(dis[v]^dis[lca(u,v)])$
因为抑或自己为0,而抑或0为自己,那么1到点u再抑或1到点$lca(u,v)$,就相当于点u抑或了$lca(u,v)$
毫无疑问,抑或满足结合律$(dis[u]^dis[v])^(dis[lca(u,v)]^dis[lca(u,v)])$
由性质3,4得出$ans=dis[u]^dis[v]$
极其简短的代码以及神奇的性质:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring> #define N 1010100
using namespace std; int n,m,head[N],tot;
struct nodE {
int to,next,w;
} e[N]; void add(int u,int v,int w) {
e[++tot].to=v,e[tot].next=head[u],head[u]=tot,e[tot].w=w;
} int dis[N];
void dfs(int u,int fa,int Xor){
dis[u]=Xor;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v!=fa) dfs(v,u,Xor^e[i].w);
}
}
int main() {
scanf("%d",&n);
for(int u,v,w,i=; i<n; i++) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
dfs(,,);
scanf("%d",&m);
for(int u,v,i=; i<=m; i++) {
scanf("%d%d",&u,&v);
printf("%d\n",dis[u]^dis[v]);
} return ;
}
洛谷——P2420 让我们异或吧的更多相关文章
- 洛谷 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树. 都知道异或操作是有传递性的,那么我们就维护 ...
- 【洛谷P2420】让我们异或吧
题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...
- 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和哪一个数的异或值最大. 一种很不错的做 ...
随机推荐
- python2.x里unicode错误问题
import sys reload(sys) sys.setdefaultencoding('utf8')
- CrystalQuartz实现Quartz的window服务的远程管理
1. 建一个空的ASP.NET WebSite,利用NuGet安装CrystalQuartz.Remote 包 我们可以看到,配置文件中多了如下节点: <crystalQuartz> &l ...
- Eclipse中直接执行sql语句(图文说明)
转自:https://blog.csdn.net/changjyzzu/article/details/45487847 1.首先新建sql文件,然后打开文件 22.右键点击空白处,点击set-con ...
- 11.Extjs登录页面js
/** * @author sux * @desc 登录 */ Ext.onReady(function(){ Ext.QuickTips.init(); //错误信息显示必须 var loginFo ...
- bzoj 3396: [Usaco2009 Jan]Total flow 水流【最大流】
最大流生动形象的板子,注意数组开大点 #include<iostream> #include<cstdio> #include<queue> #include< ...
- knockout jquery警告删除
//触发删除的动作 $("a.delete").live('click', function () { var ...
- 递推DP UVA 1366 Martian Mining
题目传送门 /* 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 到达边界后把沿途路上的权值相加求和使最大 DP:这是道递推题,首先我题目看了老 ...
- Jsp四个作用域page、request、session和application的区别
1.简单说 page指当前页面.在一个jsp页面里有效 2.request 指从http请求到服务器处理结束,返回响应的整个过程.在这个过程中使用forward方式跳转多个jsp.在这些页面里你都可 ...
- PS技巧汇总
一.gif图流程 1:素材图片a 图片b 2:窗口--->时间轴/动画 3:复制所选帧--->设置帧延迟 4:文件--->存储为WEB格式--->gif格式 二.批处理--- ...
- 在dataGridView空间中添加数据
//查询信息sql语句 string sql = "select studentName,addres from student"; SqlDataAdapter adapter ...