牛客网-Beauty of Trees 【加权并查集】
锟斤拷锟接o拷https://www.nowcoder.com/acm/contest/119/A
锟斤拷源锟斤拷牛锟斤拷锟斤拷
锟斤拷目锟斤拷锟斤拷
One day the tree manager wants to play a game with you. There are N trees lining up in a straight road. The beauty of a set of trees is defined as the bitwise XOR sum of the heights of these trees. The game will last for M rounds, and each time he will tell you an interval [Li,Ri] and its beauty. However, he mixed some fake messages with the correct ones. Your task is to find the messages that cannot logically correspond to its former correct messages. Otherwise you锟斤拷ll think the message is correct.
锟斤拷锟斤拷锟斤拷锟斤拷:
The first line contains two integer N and M(1锟斤拷N,M锟斤拷10
5
), the number of trees and the rounds of game.
Then M lines followed, in each line are three integer L, R and k(1锟斤拷L锟斤拷R锟斤拷N,0锟斤拷k锟斤拷10
9
), indicating that the beauty of [L
i
,R
i
] is k.
锟斤拷锟斤拷锟斤拷锟�:
If the i-th message is wrong, then print i in a single line.
If there is no mistake, print -1.
锟斤拷锟斤拷
3 4
1 3 6
1 2 5
3 3 10000
3 3 3
锟斤拷锟�
3
说锟斤拷
You can infer from the first two messages that the height of the third tree is 3.
r[a]记录的是a与其父亲节点的异或值
1 /**
2 先要知道加权并查集:https://blog.csdn.net/qq_32944513/article/details/80218138
3 然后 这里
4 设 P[i] 为 0~i 的异或值, 则给了 (L,R)=k 相当就是知道了 P[r]^P[l-1]=k;
5 这样转化一下 就和 LA4487 差不多了。
6 **/
7 #include<iostream>
8 #include<stdio.h>
9 #include<string.h>
10 #include<vector>
11 #include<map>
12 #include<algorithm>
13 using namespace std;
14 typedef long long int ll;
15 const int maxn = 100000;
16 const int inf = 1e9;
17 int n,m,fa[maxn+5],r[maxn+5],ans[maxn+5];
18 int findset(int x)
19 {
20 if(fa[x] == x) return x;
21 int fx = fa[x];
22 fa[x] = findset(fa[x]);
23 r[x]^=r[fx];
24 return fa[x];
25 }
26 int Merge(int u,int v,int z)
27 {
28 int fx = findset(u), fy = findset(v);
29 if(fx==fy)
30 {
31 return (r[u]^r[v])==z;
32 }
33 fa[fx] = fy;
34 r[fx]=r[u]^r[v]^z;
35 return true;
36 }
37 int main()
38 {
39 int num = 0;
40 scanf("%d %d",&n,&m);
41 for(int i=0;i<=n;i++) fa[i] = i,r[i] = 0;
42 for(int i=1; i<=m; i++)
43 {
44 int l,r,w;
45 scanf("%d %d %d",&l,&r,&w);
46 if(!Merge(l-1,r,w)) ans[++num] = i;
47 }
48 for(int i=1;i<=num;i++) printf("%d\n",ans[i]);
49 if(num==0) printf("-1\n");
50 return 0;
51 }
官方题解:
1 /*
2 考虑给定的区间[L,R]中的数和美丽值k的二进制分解。对于第j位,如果k在这一位是1,
3 说明[L,R]之间在这一位为1的数有奇数个,接下来令f[i][j]表示第j位为1的数在前i个数里有多少个,
4 那么这个条件也就是f[l-1][j]与f[r][[j]奇偶性不同;若k在这一位为0,
5 说明f[l-1][j]与f[r][j]奇偶性相同。注意上述条件都是等价的,
6 也就是说如果所有的j位f[l-1][j]和先前确定的与f[r][j]的关系不矛盾的话,
7 就等价于题目所给的合乎逻辑。这个过程可以用并查集来完成。
8 对于每一个前缀和开一个实点一个虚点,如果两个前缀和奇偶性相同,
9 就实对实虚对虚相连;如果奇偶性不同,就各自实对虚相连。
10 这样就能保证与任意节点奇偶性偶数次不同相当于奇偶性相同。然后判断的时候可以直接查询。
11 */
12 #include<cstdio>
13 #include<cstring>
14 #include<iostream>
15
16 using namespace std;
17
18 const int maxn=1e5+10;
19
20 int n,m,l,r,k,fl,cnt;
21 int f[maxn*2][32];
22
23 int find(int t,int k)
24 {
25 int p=t,r;
26 while(t!=f[t][k])t=f[t][k];
27 while(p!=t)r=f[p][k],f[p][k]=t,p=r;
28 return t;
29 }
30
31 void unio(int l,int r,int j)
32 {
33 if(find(l,j)!=find(r,j))
34 f[find(l,j)][j]=find(r,j);
35 }
36
37 int main()
38 {
39 scanf("%d%d",&n,&m);
40 for(int i=0; i<=n*2+1; i++)
41 for(int j=0; j<=30; j++)
42 f[i][j]=i;
43
44 for(int i=1; i<=m; i++)
45 {
46 fl=0;
47 scanf("%d%d%d",&l,&r,&k);
48 l--;
49
50 for(int j=0; j<=30; j++)
51 if((k&(1LL<<j))!=0&&(find(l,j)==find(r,j)||find(l+n+1,j)==find(r+n+1,j)))
52 {
53 printf("%d\n",i);
54 fl=1;
55 break;
56 }
57 else if((k&(1LL<<j))==0&&(find(l,j)==find(n+r+1,j)||find(r,j)==find(n+l+1,j)))
58 {
59 printf("%d\n",i);
60 fl=1;
61 break;
62 }
63 if(fl)continue;
64
65 cnt++;
66 for(int j=0; j<=30; j++)
67 if((k&(1LL<<j))!=0)unio(l,r+n+1,j),unio(r,l+n+1,j);
68 else unio(l,r,j),unio(l+n+1,r+n+1,j);
69 }
70
71 if(cnt==m)printf("-1");
72
73 return 0;
74 }
参考博客:戳这里
牛客网-Beauty of Trees 【加权并查集】的更多相关文章
- 牛客网-Beautiful Land 【01背包 + 思维】
链接:https://www.nowcoder.com/acm/contest/119/F来源:牛客网 Now HUST got a big land whose capacity is C to p ...
- 牛客网 --java问答题
http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...
- 牛客网《BAT面试算法精品课》学习笔记
目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...
- C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - ...
- 牛客网第9场多校E(思维求期望)
链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...
- 牛客网暑期ACM多校训练营(第七场)Bit Compression
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...
- Beautiful Numbers(牛客网)
链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...
- 牛客网华为机试题之Python解法
牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...
- 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)
链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
随机推荐
- JAVA编程中button按钮,actionlistener和mouseClicked区别
在java的编程中,对于按钮button 有两个事件: 1.actionPerformed 2.mouseClicked 区别: actionPerformed:一般事件,仅侦听鼠标左键的单击事件,右 ...
- Spring Boot(IDEA,Gradle)超详细用户管理项目(一)——Hello World
1.构建工具的配置(Gradle):自定义-所有设置:构建.执行.部署-构建工具-Gradle: 设置Gradle用户主目录:(该目录相当于仓库,gradle将下载所需依赖到此目录下),此目录下可新建 ...
- CSS不用背景图片实现优惠券样式反圆角,凹圆角,反向半圆角,并且背景渐变
日常开发过程中,特别是商城相关应用开发过程中,时常会遇到花里胡哨的设计图,比如优惠券样式,上图: 实现思路如下: 1.先写一个外容器,实现背景色渐变: Html: 1 <div clas ...
- NFS存储迁移至GlusterFS
NFS存储迁移至GlusterFS 前提条件 为防止脑裂,建议使用最低3台节点制作3复制集的存储卷: 在进行存储迁移前,GluseterFS存储节点需先成为k8s集群中的node节点: 存储切换时请勿 ...
- Ansible自动化运维工具的使用
Ansible自动化运维工具的使用 host lnventory 管理主机 ip root账号密码 ssh端口 core mod ...
- What is the difference between Serialization and Marshaling?
How to serialize and deserialize JSON using C# - .NET | Microsoft Docs https://docs.microsoft.com/en ...
- REST 架构的替代方案 为什么说GraphQL是API的未来?
Managing enterprise accounts - GitHub Docs https://docs.github.com/en/graphql/guides/managing-enterp ...
- 洛谷P3850 书架
题目描述 Knuth先生家里有个精致的书架,书架上有N本书,如今他想学到更多的知识,于是又买来了M本不同的新书.现在他要把新买的书依次插入到书架中,他已经把每本书要插入的位置标记好了,并且相应的将它们 ...
- 通过spring statemmachine 自定义构建属于自己的状态机(两种方式)
spring 的stateMachine 相对于当前的版本,还是比较新颖的,但是对于合适的业务场景,使用起来还是十分的方便的.但是对于官网提供的文档,讲解的是十分的精简,要想更深入的了解其内部架构,只 ...
- OpenStack (neutron 网络服务)
neutron介绍 提供 OpenStack 虚拟网络服务,也是 OpenStack 重要的核心模块之一,该模块最开始是 Nova 的一部分,叫 nova-network,后来从 Nova 中分离出来 ...