题目传送门

题意:训练指南P245

分析:首先这道是经典的并查集题目,利用异或的性质。异或性质:x ^ 0 = x -> a ^ a = 0 -> x ^ a ^ a = x,即一个数对某个数异或偶数次等于它本身。

第一种操作:p = v,设立一个超级根节点RT,rt[p] = RT, edge[p] = v,表示p的父亲节点是RT,到它的值就是p本身的值(p^0)。第二种p q v操作,分别找p和q的祖先,将祖先合并,那么edge[r1] = v1 ^ v2 ^ v3,这样保证下一次v1'仍然是p到祖先的异或值,这样p ^ q = p ^ root' ^ q ^ root' = v1'^v2’。第三种操作,如果pi的祖先是RT,那么v1就是p的值,否则v1 = p ^ rootp,这样需要同一个祖先的个数是偶数才能将祖先的影响取消。

#include <bits/stdc++.h>
using namespace std; const int N = 2e4 + 5;
const int Q = 4e4 + 5;
struct DSU {
int rt[N], edge[N];
void clear(void) {
memset (rt, -1, sizeof (rt));
}
int Find(int x, int &val) {
if (rt[x] == -1) {
val = 0; return x;
}
int root = Find (rt[x], val);
val ^= edge[x];
edge[x] = val;
rt[x] = root;
return root;
}
void Union(int x, int y, int val) {
if (x > y) swap (x, y);
rt[x] = y; edge[x] = val;
}
}dsu;
int id[N], RT; void error(int fac) {
printf ("The first %d facts are conflicting.\n", fac);
} int main(void) {
int n, m, cas = 0;
while (scanf ("%d%d", &n, &m) == 2) {
if (!n && !m) break;
printf ("Case %d:\n", ++cas);
RT = n; //super root
dsu.clear ();
bool err = false;
char str[30]; int p, q, k, v1, v2, v3, r1, r2;
int facts = 0;
for (int i=1; i<=m; ++i) {
scanf ("%s", &str);
if (str[0] == 'I') {
facts++;
gets (str);
if (err) continue;
if (sscanf (str, "%d %d %d", &p, &q, &v3) == 2) {
v3 = q;
int r1 = dsu.Find (p, v1);
if (r1 == RT) { //super tree
if (v1 != v3) {
error (facts); err = true;
}
}
else {
dsu.Union (r1, RT, v1 ^ v3);
}
}
else {
int r1 = dsu.Find (p, v1);
int r2 = dsu.Find (q, v2);
if (r1 == r2) { //in the same tree
if ((v1 ^ v2) != v3) {
error (facts); err = true;
}
}
else dsu.Union (r1, r2, v1 ^ v2 ^ v3); //cat r1 and r2
}
}
else {
scanf ("%d", &k);
for (int j=1; j<=k; ++j) {
scanf ("%d", &id[j]);
}
if (err) continue;
int ans = 0;
vector<int> rs;
for (int j=1; j<=k; ++j) {
int r1 = dsu.Find (id[j], v1);
ans ^= v1;
if (r1 != RT) {
rs.push_back (r1);
}
}
if (rs.size () % 2 == 1) {
printf ("I don't know.\n");
}
else {
sort (rs.begin (), rs.end ());
for (int j=0; j<rs.size (); j+=2) {
if (rs[j] != rs[j+1]) {
ans = -1; break;
}
}
if (ans == -1) {
printf ("I don't know.\n");
}
else printf ("%d\n", ans);
}
}
}
puts ("");
} return 0;
}

  

并查集(加权) LA 4487 Exclusive-OR的更多相关文章

  1. 并查集(图论) LA 3644 X-Plosives

    题目传送门 题意:训练指南P191 分析:本题特殊,n个物品,n种元素则会爆炸,可以转移到图论里的n个点,连一条边表示u,v元素放在一起,如果不出现环,一定是n点,n-1条边,所以如果两个元素在同一个 ...

  2. UVALive 4487 Exclusive-OR 加权并查集神题

    已知有 x[0-(n-1)],但是不知道具体的值,题目给定的信息 只有 I P V,说明 Xp=V,或者 I P Q V,说明 Xp ^ Xq=v,然后要求回答每个询问,询问的是 某任意的序列值 Xp ...

  3. UVALive(LA) 4487 Exclusive-OR(带权并查集)

    题意:对于n个数X[0]~X[n-1],但你不知道它们的值,通过逐步提供给你的信息,你的任务是根据这些信息回答问题,有三种信息如下: I p  v : Xp = v;    Xp 的值为v I p q ...

  4. hdu 3047 Zjnu Stadium(加权并查集)2009 Multi-University Training Contest 14

    题意: 有一个运动场,运动场的坐席是环形的,有1~300共300列座位,每列按有无限个座位计算T_T. 输入: 有多组输入样例,每组样例首行包含两个正整数n, m.分别表示共有n个人,m次操作. 接下 ...

  5. hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)

    这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ...

  6. HDU 3407.Zjnu Stadium 加权并查集

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. A Bug's Life(加权并查集)

    Description Background  Professor Hopper is researching the sexual behavior of a rare species of bug ...

  8. A Bug's Life(加权并查集)

    Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs ...

  9. P1196 银河英雄传说(加权并查集)

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

随机推荐

  1. [Android Pro] Android 4.1 使用 Accessibility实现免Root自动批量安装功能

    reference to  :  http://www.infoq.com/cn/articles/android-accessibility-installing?utm_campaign=info ...

  2. shared_ptr 和 unique_ptr

    c++11标准废除乐auto_ptr, C++ 标准库智能指针 使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项. unique_ptr 只允许基础指针的一个所有者. 除非你 ...

  3. 安装mysql后ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了

    ps -A | grep -i mysql kill 列出来的进程 service mysql start 我的问题就解决了 ------------------------------------- ...

  4. iOS源码之OC相册,可以循环查看图片

    #import "ViewController.h" #import "YZUIScrollView.h" #define kuan ([UIScreen ma ...

  5. DOM – 7.动态创建DOM + 8.innerText innerHTML value

    7.动态创建DOM 8.innerText  innerHTML  value 7+8 练习:案例:点击按钮动态增加网站列表,分两列,第一列为网站的名字,第二列为带网站超链接的网站名.增加三行常见网站 ...

  6. ****php:require_once(dirname(__FILE__)."/./config_uc.php");

    Q:麻烦清楚地讲解一下这句的意思,具体路径是怎样的,这个文解在 根目录,如果我想放在根目录下的tieba文件夹里,应该怎么修改/./ 这个是表示什么? A: require_once(dirname( ...

  7. Mysql数据库操作系统及配置参数优化

    数据库结构优化 表的水平拆分常用的水平拆分方法为:1.对 customer_id进行 hash运算,如果要拆分成5个表 则使用mod(customer_id,5)取出0-4个值2.针对不同的 hash ...

  8. 第十八篇:在SOUI中实现PreTranslateMessage

    在MFC中,通常可以通过重载CWnd::PreTranslateMessage这样一个虚函数来实现对一些窗口消息的预处理.多用于tooltip的显示控制. 在SOUI中也实现了类似的机制. 要在SOU ...

  9. linux系统定时任务

    crontab常用的几个命令如下 sudo crontab -l #显示所有的定时任务 sudo crontab -e #编辑任务 sudo crontab -r #删除所有的任务 编辑任务时的书写方 ...

  10. 程序员最喜爱的12个Android应用开发框架二(转)

    在上一篇程序员最喜爱的12个Android应用开发框架(一)中,我们为大家介绍了前6个Android应用开发框架,主要包括了 Xamarin.Phonegap.Corona SDK等.接下来,小编将继 ...