锟斤拷锟接o拷https://www.nowcoder.com/acm/contest/119/A
锟斤拷源锟斤拷牛锟斤拷锟斤拷

锟斤拷目锟斤拷锟斤拷

It锟斤拷s universally acknowledged that there锟斤拷re innumerable trees in the campus of HUST.
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.
示锟斤拷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与其父亲节点的异或值
通过并查集合并的过程同时更新路径上的r值
令fa,fb分别是a,b,的父亲节点
我们知道r[a] = a^fa,r[b]=b^fa,a^b=c
那么在合并fa,fb的时候,令fb为fa的父节点
那么就有r[fa]=fa^fb
而r[a]=a^fa,所以fa=a^r[a]
同理fb=b^r[b]
所以r[fa] = r[a]^r[b]^a^b = r[a]^r[b]^c
当然对于一个节点合并问题不好解决,此时可以添加一一个新节点n作为根节点,使得n的值为0,那么任何值与0的异或都是本身
这样一来合并问题就解决了
 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 【加权并查集】的更多相关文章

  1. 牛客网-Beautiful Land 【01背包 + 思维】

    链接:https://www.nowcoder.com/acm/contest/119/F来源:牛客网 Now HUST got a big land whose capacity is C to p ...

  2. 牛客网 --java问答题

    http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...

  3. 牛客网《BAT面试算法精品课》学习笔记

    目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...

  4. C++版 - HDUoj 2010 3阶的水仙花数 - 牛客网

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - ...

  5. 牛客网第9场多校E(思维求期望)

    链接:https://www.nowcoder.com/acm/contest/147/E 来源:牛客网 题目描述 Niuniu likes to play OSU! We simplify the ...

  6. 牛客网暑期ACM多校训练营(第七场)Bit Compression

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 题目描述 A binary string s of length N = 2n is give ...

  7. Beautiful Numbers(牛客网)

    链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...

  8. 牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  9. 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)

    链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

随机推荐

  1. 发票校验BAPI_INCOMINGINVOICE_CREATE

    CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'    EXPORTING      headerdata                = headerdata ...

  2. Python语言程序设计---函数的定义与使用

    推荐一个Python学习交流的q群:610380249 在学习Python的过程中,有什么不懂的问题都可以发群里,一起讨论. 1 函数的理解和定义 函数是一段代码的表示,所指定的参数是一种占位符,如果 ...

  3. 浅谈java中线程和操作系统线程

    在聊线程之前,我们先了解一下操作系统线程的发展历程,在最初的时候,操作系统没有进程线程一说,执行程序都是串行方式执行,就像一个队列一样,先执行完排在前面的,再去执行后面的程序,这样的话很多程序的响应就 ...

  4. Dapper原来还可以直接这样写SQL,很强大哦

    网络上对Dapper的解释是这样的: Dapper是一个简单的.NET对象映射器,在速度方面具有"King of Micro ORM"的头衔,几乎与使用原始的ADO.NET数据读取 ...

  5. jQuery 自动生成二维码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...

  6. The Node.js Event Loop, Timers, and process.nextTick()

    The Node.js Event Loop, Timers, and process.nextTick() | Node.js https://nodejs.org/uk/docs/guides/e ...

  7. Index-Only Scans and Covering Indexes

    小结: 1.覆盖索引 回表 2. All indexes in PostgreSQL are secondary indexes, meaning that each index is stored ...

  8. 一个基于protocol buffer的RPC实现

    Protocol Buffer仅仅是提供了一套序列化和反序列化结构数据的机制,本身不具有RPC功能,但是可以基于其实现一套RPC框架. Services protocol buffer的Service ...

  9. Wireshark抓包参数

    目录 wireshark 抓包过滤器 一.抓包过滤器 二.显示过滤器 整理自陈鑫杰老师的wireshark教程课 wireshark 抓包过滤器 过滤器分为抓包过滤器和显示过滤器,抓包过滤器会将不满足 ...

  10. python ---strip()方法,split()方法,删除字符串开头或结尾,字符串分隔

    本文介绍了strip()方法,split()方法, 字典的按键值访问的方法, 1.Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列. 注意:该方法只能删除开头或是 ...