Problem - 3234

  题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事。

  这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就可以了。

代码如下:

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stack>
#include <set> using namespace std; const int N = ;
struct MFS {
int fa[N], rel[N], val[N];
void init() { for (int i = ; i < N; i++) fa[i] = i, rel[i] = , val[i] = -;}
int find(int x) {
if (fa[x] != x) {
int fx = find(fa[x]);
rel[x] ^= rel[fa[x]];
fa[x] = fx;
val[x] = val[fx] ^ rel[x];
return fx;
} else return x;
}
bool merge(int x, int y, int d) {
int fx = find(x), fy = find(y);
if (fx == fy) return d == (rel[x] ^ rel[y]);
int dx = rel[x] ^ rel[fx], dy = rel[y] ^ rel[fy];
if (~val[fx] && ~val[fy]) return d == (dx ^ dy ^ val[fx] ^ val[fy]);
d ^= dx ^ dy;
if (~val[fx]) rel[fy] ^= d, fa[fy] = fx;
else rel[fx] ^= d, fa[fx] = fy;
return true;
}
bool confirm(int x, int d) {
int fx = find(x);
if (~val[fx]) return (rel[x] ^ val[fx]) == d;
val[fx] = rel[x] ^ d;
return true;
}
int query(int x) {
int fx = find(x);
if (~val[x]) return val[x];
return -;
}
} mfs; set<int> nsid;
int ns[N]; int main() {
// freopen("in", "r", stdin);
char buf[];
int n, m, val[], cnt, cas = ;
while (~scanf("%d%d", &n, &m) && (n || m)) {
mfs.init();
bool conf = false;
char *ptr;
cnt = ;
printf("Case %d:\n", cas++);
for (int q = ; q <= m; q++) {
scanf("%s", buf);
gets(buf + );
val[] = ;
ptr = strtok(buf + , " ");
while (ptr) {
val[]++;
sscanf(ptr, "%d", &val[val[]]);
ptr = strtok(NULL, " ");
}
if (conf) continue;
if (buf[] == 'I') {
cnt++;
if (val[] == ) conf = !mfs.merge(val[], val[], val[]);
else conf = !mfs.confirm(val[], val[]);
if (conf) printf("The first %d facts are conflicting.\n", cnt);
} else {
int ans = , tmp, fa;
nsid.clear();
for (int i = ; i <= val[]; i++) {
tmp = mfs.query(val[i]);
fa = mfs.find(val[i]);
// cout << tmp << ' ';
if (tmp < ) {
if (nsid.find(fa) != nsid.end()) {
ans ^= ns[fa] ^ mfs.rel[val[i]];
nsid.erase(fa);
} else {
nsid.insert(fa);
ns[mfs.fa[val[i]]] = mfs.rel[val[i]];
}
} else ans ^= tmp;
}
// cout << endl;
if (!nsid.empty()) puts("I don't know.");
else printf("%d\n", ans);
}
}
puts("");
}
return ;
}

——written by Lyon

hdu 3234 Exclusive-OR (并查集)的更多相关文章

  1. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  2. hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

    hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...

  3. <hdu - 1232> 畅通工程 并查集问题 (注意中的细节)

    本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232  结题思路:因为题目是汉语的,那我就不解释题意了,要求的是最少建设的道路,我们可以用并查集来做这 ...

  4. HDU 5441 Travel(并查集+统计节点个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...

  5. HDU 4313 Matrix(并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=4313 题意: 给出一棵树,每条边都有权值,其中有几个点是特殊点,现在破坏边还使得这几个特殊点互相不可达,需要使得 ...

  6. hdu 1558 (线段相交+并查集) Segment set

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...

  7. HDU 3018 Ant Trip (并查集求连通块数+欧拉回路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题目大意:有n个点,m条边,人们希望走完所有的路,且每条道路只能走一遍.至少要将人们分成几组. ...

  8. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

  9. HDU 6109 数据分割 并查集,SET

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6109 题意:中文题面 解法:每次都贪心地尝试将尽量多的条件放进当前这组,遇到第一个与已有条件冲突时,就 ...

随机推荐

  1. 洛谷1081 (NOIp2012) 开车旅行——倍增预处理

    题目:https://www.luogu.org/problemnew/show/P1081 预处理从每个点开始a能走多少.b能走多少.可以像dp一样从后往前推. 但有X的限制.所以该数组可以变成倍增 ...

  2. 定位真机运行能用但是打包成apk就不能用的解决方法

    打包apk的SHA1,与key的SHA1(这是多人开发的通病不同电脑共同开发一个app的常见错误之一)不一致.解决方法: 今天虽然离职了,但是今天遇到的是,当我在用高德地图开发的时候,在Android ...

  3. web前端学习(四)JavaScript学习笔记部分(5)-- 事件流详解

    1.JS事件详解-事件流 1.1.事件流 1.事件流: 描述的是在页面中接受事件的顺序 2.事件冒泡: 由最具体的元素接收,然后逐级上传播至最不具体的节点(文档) 3.事件捕获: 最不具体的节点先接收 ...

  4. 最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)

    参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html 最短路径问题 Time Limit: 2000/1000 MS ...

  5. tes..

    力扣刷题 二分查找法 二分查找法又称折半查找法. 优点:比较次数少,查找速度快,平均性能好: 缺点:要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 首先 ...

  6. FZU 1576【计算几何/费马点】

    Oaiei居住在A城市,并且是这个城市建设的总设计师.最近有个问题一直困恼着他.A城市里有三个大型工厂,每个大型工厂每天都需要消耗大量的石油,现在城市里要建设一个石油中转站,从石油中转站到三个大型工厂 ...

  7. 【时光回溯】【JZOJ3567】【GDKOI2014】石油储备计划

    题目描述 输入 输出 对于每组数据,输出一个整数,表示达到"平衡"状态所需的最小代价. 样例输入 2 3 6 1 5 1 2 1 2 3 2 5 4 5 4 3 2 1 3 1 1 ...

  8. Directx11教程(56) 建立一个skydome

    原文:Directx11教程(56) 建立一个skydome       本章建立一个skydome(天空穹),主要学习如何使用cube mapping.      cube map就是把六张纹理当作 ...

  9. NS2学习笔记

    这两天在调一个仿真程序,比较奇怪的错误,就是一个节点广播消息,在它通信半径内的节点收不到消息,一直在通信上找问题,找了半天也没找到. 最后,用gdb调试,发现在一个操作指针处发生了段错误,引起的原因时 ...

  10. mysql的执行计划概念说明

    explain中的列的说明 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的 顺序增长的. id列越大执行优先级越高, ...