hdu 3234 Exclusive-OR (并查集)
题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事。
这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就可以了。
代码如下:
#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 (并查集)的更多相关文章
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)
hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...
- <hdu - 1232> 畅通工程 并查集问题 (注意中的细节)
本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 结题思路:因为题目是汉语的,那我就不解释题意了,要求的是最少建设的道路,我们可以用并查集来做这 ...
- HDU 5441 Travel(并查集+统计节点个数)
http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...
- HDU 4313 Matrix(并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=4313 题意: 给出一棵树,每条边都有权值,其中有几个点是特殊点,现在破坏边还使得这几个特殊点互相不可达,需要使得 ...
- hdu 1558 (线段相交+并查集) Segment set
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...
- HDU 3018 Ant Trip (并查集求连通块数+欧拉回路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题目大意:有n个点,m条边,人们希望走完所有的路,且每条道路只能走一遍.至少要将人们分成几组. ...
- hdu 1863 畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others) M ...
- HDU 6109 数据分割 并查集,SET
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6109 题意:中文题面 解法:每次都贪心地尝试将尽量多的条件放进当前这组,遇到第一个与已有条件冲突时,就 ...
随机推荐
- 有趣的HTML5 Web SQL 数据库
Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 核心方法 以下是规范中定义的三个核心方法: openD ...
- Django独有报错的原因和解决
RuntimeError at /login You called this URL via POST, but the URL doesn't end in a slash and you have ...
- cf round 482D Kuro and GCD and XOR and SUM
题意: 开始有个空集合,现在有两种操作: $(1,x)$:给集合加一个数$x$,$x \leq 10^5$; $(2,x,k,s)$:在集合中找一个$a$,满足$a \leq s-x$,而且$k|gc ...
- Phpstrom 配置php版本语法支持
- TextBlock中显示文字和图片,且不会自动换行
原本TextBlock显示图片是很容易的,即TextBlock.Inlines.Add(UiElement element):这个方法即可, 但是,会出现如下效果: 我不想要这种效果,所以改了下代 ...
- 【JZOJ3623】【SDOI2014】数表(table) 树状数组+离线+莫比乌斯反演
题面 100 \[ Ans=\sum_{i=1}^n\sum_{j=1}^mg(gcd(i,j)) \] 其中, \[ g(d)=\sum_{i|d}i \] 我们注意到\(gcd(i,j)\)最多有 ...
- Leetcode709.To Lower Case转换成小写字母
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串. 示例 1: 输入: "Hello" 输出: & ...
- 【难为听】weex-ui
eslint 不喜欢,但是确实规范了代码,同古代统一货币一样,有无穷的意义.故喜欢 weex-ui在项目中的使用方法 npm install -g weex-toolkit@latest weex c ...
- 移动端fixed定位在底部,出现键盘后消失
jq var h=$(window).height(); $(window).resize(function() { if($(window).height()<h){ $('.nav').hi ...
- 几道莫名AC的并查集题
那啥那啥 原本今天还是做(看)差分约束的,但是上不去Vjudge我只能来刷并查集了. %%%静萱大佬把那么多年的noip题都刷遍了,我只能刷水题,noip的题实在是太难了不会啊. 第一道:洛谷P202 ...