洛谷——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和哪一个数的异或值最大. 一种很不错的做 ...
随机推荐
- docker 清理容器和镜像
在docker运行过程中,会不知不觉造出很多容器,很多都是不用的,需要清理. 下面就是一些清理办法,一个个清理肯定很低效,批量清理很有意思. 查看正在运行的容器 # docker ps -q 9b9f ...
- ZOJ 3956 Course Selection System 背包DP
ZOJ3956 观察数据范围, c的值非常小 只有100 所以c的和也很有限 只有50000 是否可以从这里下手? 对于某一个c的和 我们一定希望h的和最大 才有可能是最终答案. 于是有了类似背包的d ...
- ASP.NET给前端动态添加修改 CSS样式JS 标题 关键字(转载)
原文地址:http://www.cnblogs.com/xbhp/p/6392225.html 有很多网站读者能换自己喜欢的样式,还有一些网站想多站点共享后端代码而只动前段样式,可以采用动态替换CSS ...
- 【FFmpeg】FFmpeg常用基本命令(转载)
转自:http://www.cnblogs.com/dwdxdy/p/3240167.html 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an outp ...
- chrome 跨域设置-(完善博客内容)
目的完善自己的一套 ajax前端开发流程,在网上扒了一份成功的案例. 出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程 ...
- bzoj 1599: [Usaco2008 Oct]笨重的石子【枚举】
--我为什么要写这种题解-- 枚举投掷情况即可 #include<iostream> #include<cstdio> using namespace std; int s1, ...
- ECMA里面的一元符
只能操作一个值的叫做一元操作符.一元操作符是ECMAScript中最简单的操作符 1.递增和递减操作符 递增和递减操作符直接借鉴自c,而且各有俩个版本,前置型和后置型.顾名思义,前置型就是位于要操作的 ...
- [Swift通天遁地]一、超级工具-(19)制作六种别具风格的动作表单
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [算法] 常见排序算法总结(C语言版)
常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...
- 01背包(类) UVA 10564 Paths through the Hourglass
题目传送门 /* 01背包(类):dp[i][j][k] 表示从(i, j)出发的和为k的方案数,那么cnt = sum (dp[1][i][s]) 状态转移方程:dp[i][j][k] = dp[i ...