洛谷——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和哪一个数的异或值最大. 一种很不错的做 ...
随机推荐
- redis Database Eviction Policies Redis on Flash
Database Eviction Policies - Redis Enterprise Software | Redis Labs https://redislabs.com/redis-ente ...
- 4.4 Top-Down Parsing
4.4 Top-Down Parsing Top-down parsing can be viewed as the problem of constructing a parse tree for ...
- [原创]桓泽学音频编解码(13):AC3 位分配模块算法分析
[原创]桓泽学音频编解码(1):MPEG1 MP3 系统算法分析 [原创]桓泽学音频编解码(2):AC3/Dolby Digital 系统算法分析 [原创]桓泽学音频编解码(3):AAC 系统算法分析 ...
- POJ1264 SCUD Busters 凸包
POJ1264 有m个国家(m<=20)对每个国家给定n个城镇 这个国家的围墙是保证围住n个城镇的周长最短的多边形 必然是凸包 进行若干次导弹发射 落到一个国家内则国家被破坏 最后回答总共有多少 ...
- libpcap 中调用ctime()时警告提示:
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=] ...
- mac+php+xdebug
1,下载xdebug 2,进入xdebug-2.4.0RC4目录,运行phpize命令, 2,google之后说要安装autoconf brew install autoconf 3,但是使用brew ...
- bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会【tarjan】
几乎是板子,求有几个size>1的scc 直接tarjan即可 #include<iostream> #include<cstdio> #include<cstri ...
- SpringBoot整合SpringSecurity简单案例
在我们开发项目的过程中经常会用到一些权限管理框架,Java领域里边经常用的可能就是shiro了,与之对应的还有SpringSecurity,SpringSecurity可以说是非常强大,与Spring ...
- layui 动态左树导航栏显示样式BUG规避
先看问题现象: 使用 layui 的左树功能,先在html页面添加左树功能引入 <ul class="layui-nav layui-nav-tree layui-nav-side&q ...
- WKWebView 和 UIWebView 允许背景音乐自动播放(记录)
WKWebView WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.allowsInlin ...