题意:

      给你n个未知的正整数,有三总操作

      I P V            P的值是V

      I P Q V          P XOR Q = V

      Q K x1 x2....xk  求这k个数所有异或后的值

思路:

      带权并查集,感觉这个题目用的很巧,设计到以下知识,a ^ b = c ,a ^ c = b ,b 

^ c = a他们三个是等价的,还有就是a ^ b ^ a = b ,这个题目自己好好画画就出来了,确定好带权并查集后可以虚拟出来一个点,把它做为真实点,就是如果谁的根是他那么这个值就已经确定了,我虚拟的是0点,把其他的点都映射成+1,还有就是这个题目的核心部分就是查询的那个地方,除了确定的点,其他的必须是每个集合都出现了偶数个的时候才能算出来,原因就是“性质不同的数不能乘在一起,要么就是相对位置相乘,要么就是确定的数字相乘,两个相对位置相乘的到的是确定的数字,确定的数字相乘得到的还是确定的数字”,这个题目设计到很多细节,我就不说了,谁做谁知道啊!
还有就是提醒个最坑的地方 a ^ b != c 他和 (a ^ b) != c不是等价的,优先级的原因。其他的做的时候就知道了,今天手残,这个题目做了17次才AC.


#include<stdio.h>
#include<string.h> #define N 22000

int
mer[N] ,Xor[N];
int
ss[N]; int finds(int x)
{
if(
x == mer[x]) return x;
int
t = mer[x];
mer[x] = finds(mer[x]);
Xor[x] = Xor[x] ^ Xor[t];
return
mer[x];
} int main ()
{
int
n ,m ,i ,j ,num ,p ,q ,v ,k;
int
n1 ,n2 ,n3 ,cas = 1 ,fact ,stop;
char
str[10] ,c;
while(~
scanf("%d %d" ,&n ,&m) && n + m)
{

printf("Case %d:\n" ,cas ++);
for(
i = 0 ;i <= n ;i ++)
mer[i] = i ,Xor[i] = 0;
for(
stop = fact = 0 ,i = 1 ;i <= m ;i ++)
{

scanf("%s" ,str);
if(
str[0] == 'I')
{

fact ++; int ii = 0;
while(
1)
{

scanf("%d%c" ,&num ,&c);
ii ++;
if(
ii == 1) n1 = num;
if(
ii == 2) n2 = num;
if(
ii == 3) n3 = num;
if(
c == '\n') break;
}
if(
stop) continue;
if(
ii == 2)
{

p = n1 + 1 ,v = n2;
int
x = finds(p);
if(!
x)
{
if(
Xor[p] == v) continue;
stop = 1;
printf("The first %d facts are conflicting.\n" ,fact ++);
}
else
{

mer[x] = 0;
Xor[x] = Xor[p] ^ v;
}
}
if(
ii == 3)
{

p = n1 + 1 ,q = n2 + 1 ,v = n3;
int
x = finds(p) ,y = finds(q);
if(
x == y)
{
if((
Xor[p] ^ Xor[q]) == v) continue;
stop = 1;
printf("The first %d facts are conflicting.\n" ,fact ++);
}
else
{
if(
y)
{

mer[y] = x;
Xor[y] = Xor[p] ^ Xor[q] ^ v;
}
else
{

mer[x] = y;
Xor[x] = Xor[p] ^ Xor[q] ^ v;
}
}
}
}
else
{

scanf("%d" ,&k);
memset(ss ,0 ,sizeof(ss));
int
sum = 0 ,mk = 0;
for(
j = 1 ;j <= k ;j ++)
{

scanf("%d" ,&num);
num ++;
ss[finds(num)] ++;
sum = sum ^ Xor[num];
}
for(
j = 1 ;j <= n ;j ++)
if(
ss[j] & 1) mk = 1;
if(
stop) continue;
if(
mk) puts("I don't know.");
else
printf("%d\n" ,sum);
}
}

puts("");
}
return
0;
}

hdu3234 带权并查集(XOR)的更多相关文章

  1. 【uva12232/hdu3461】带权并查集维护异或值

    题意: 对于n个数a[0]~a[n-1],但你不知道它们的值,通过逐步提供给你的信息,你的任务是根据这些信息回答问题: I P V :告诉你a[P] = V I P Q V:告诉你a[P] XOR a ...

  2. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h>using namespace std;int f[200010];//代表元long long rl[200010];//记rl[i]为结点 ...

  3. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  4. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  5. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  6. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...

  7. 【BZOJ-4690】Never Wait For Weights 带权并查集

    4690: Never Wait for Weights Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 41[Submit][ ...

  8. hdu3038(带权并查集)

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...

  9. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

随机推荐

  1. 利用CORDIC算法计算三角函数

    这里主要先介绍如何利用CORDIC算法计算固定角度\(\phi\)的\(cos(\phi)\).\(sin(\phi)\)值.参考了这两篇文章[1].[2]. 一般利用MATLAB计算三角函数时,用\ ...

  2. c++ vector对象

    下面随笔讲解c++ vector对象. vector对象 为什么需要vector? 封装任何类型的动态数组,自动创建和删除. 数组下标越界检查. 封装的如ArrayOfPoints也提供了类似功能,但 ...

  3. Java 读取Word文本框中的文本/图片/表格

    Word可插入文本框,文本框中可嵌入文本.图片.表格等内容.对文档中的已有文本框,也可以读取其中的内容.本文以Java程序代码来展示如何读取文本框,包括读取文本框中的文本.图片以及表格等. [程序环境 ...

  4. Python3基础-目录

    Python3基础-目录(Tips:长期更新Python3目录) 第一章 初识Python3  1.1 Python3基础-前言  1.2 Python3基础-规范 第二章 Python3内置函数&a ...

  5. 使用python模块plotdigitizer抠取论文图片中的数据

    技术背景 对于各行各业的研究人员来说,经常会面临这样的一个问题:有一篇不错的文章里面有很好的数据,但是这个数据在文章中仅以图片的形式出现.而假如我们希望可以从该图片中提取出数据,这样就可以用我们自己的 ...

  6. 优化自动化测试流程,使用 flask 开发一个 toy jenkins工具

    1.自动化 某一天你入职了一家高大上的科技公司,开心的做着软件测试的工作,每天点点点,下班就走,晚上陪女朋友玩王者,生活很惬意. 但是美好时光一般不长,这种生活很快被女主管打破.为了提升公司测试效率, ...

  7. WNN48T6X 54端口国产化万兆交换机

    WNN48T6X是基于盛科CTC5160设计的国产化三层万兆交换机,提供48路千兆电口和6路万兆光口,采用龙芯 2K1000处理器,支持双冗余可插拔电源供电.支持常规的L2/L3协议,支持Telnet ...

  8. css3中的渐变效果

    大家好,这里是demo软件园,今天为大家分享的是css3中的渐变效果. css3中的渐变需要注意的是渐变的是图片而不是颜色,而渐变又分为两种:线性渐变与径向渐变,今天我们重点介绍的是线性渐变. 1.线 ...

  9. Typora的一些快捷键

      语法格式 快捷键 标题 # + 空格 = 一级标题, ## + 空格 =二级标题, 以此类推 shift + 数字1 =一级标题 ,shift + 数字2 =二级标题 , 以此类推 有序列表 1 ...

  10. Hdfs block数据块大小的设置规则

    1.概述 hadoop集群中文件的存储都是以块的形式存储在hdfs中. 2.默认值 从2.7.3版本开始block size的默认大小为128M,之前版本的默认值是64M. 3.如何修改block块的 ...