hdu 3234 Exclusive-OR
Exclusive-OR
题意:输入n个点和Q次操作(1 <= n <= 20,000, 2 <= Q <= 40,000).操作和叙述的点标号k(0 < k < n)
操作分为I & Q两种,I又分为 I a v表示val[a] = v和 I a b v 即val[a] ^ val[b] = v; Q k X0,X1...Xk-1表示求出X0^X1^...^Xk-1 = ?
对于每个Q操作,结果分为 I don't know.即不能求解或输出确定值,对于每组叙述操作,若叙述与之前的矛盾则输出改标号:The first 2 facts are conflicting.且该组后面的操作直接忽略;
0 0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
const int MAXN = ;
int n,f[MAXN];
int XOR[MAXN],id[MAXN<<];//每个点到根节点(压缩之后)的XOR,以及Q查询的id;
int Find(int a)//**
{
if(a == f[a]) return a;
int fa = Find(f[a]);
XOR[a] ^= XOR[f[a]];
return f[a] = fa;
}
bool _union(int a,int b,int v)
{
int fa = Find(a),fb = Find(b);
if(fa == fb){//同一个集合就可以计算出两个点之间的异或值;和下面的偶数一致
if((XOR[a] ^ XOR[b]) != v) return false;
return true;
}
if(fa == n) swap(fa,fb);//是对于输入了a,b,v来看的,并不是对a v,b = n来设置的
f[fa] = fb;
XOR[fa] = XOR[b]^v^XOR[a];
return true;
}
char op[];
int vis[];
int Query(int k)
{
MS0(vis);
int ans = ;
rep0(i,,k){
int cnt = ;
int root = Find(id[i]);
rep0(j,i,k){
if(!vis[j] && Find(id[j]) == root){//同属一个集合;
cnt++;
vis[j] = true;
ans ^= XOR[id[j]];
}
}
if(root != n && (cnt & )) return -;
}
return ans;
}
int main()
{
int Q,kase = ;
while(scanf("%d%d",&n,&Q) == && n + Q){
rep1(i,,n) f[i] = i,XOR[i] = ;
printf("Case %d:\n",kase++);
int cnt_i = ,flag = ;
while(Q--){
scanf("%s",op);
if(op[] == 'I'){
int space = ,a,b,v;
cnt_i++;
getchar();gets(op);
rep0(i,,strlen(op))if(op[i] == ' ') space++;
if(space & ){
sscanf(op,"%d%d",&a,&v);
b = n;
}else{
sscanf(op,"%d%d%d",&a,&b,&v);
}
//printf(" %d %d %d\n",a,b,v);
if(!flag && !_union(a,b,v)){
printf("The first %d facts are conflicting.\n",cnt_i);
flag = ;
}
}else{
int k;
scanf("%d",&k);
rep0(i,,k){
scanf("%d",id+i);
}
if(flag)continue;
int ret = Query(k);
if(ret == -) puts("I don't know.");
else printf("%d\n",ret);
}
}
puts("");
}
return ;
}
hdu 3234 Exclusive-OR的更多相关文章
- HDU 4919 Exclusive or (数论 or 打表找规律)
Exclusive or 题目链接: http://acm.hust.edu.cn/vjudge/contest/121336#problem/J Description Given n, find ...
- hdu 4919 Exclusive or
Exclusive or Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) T ...
- hdu 3234 Exclusive-OR (并查集)
Problem - 3234 题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事. 这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就 ...
- hdu 3234 并查集
虚拟一个根节点n,设其值为0.并且始终保持其为根. #include<map> #include<set> #include<cmath> #include< ...
- [JAVA]HDU 4919 Exclusive or
题意很简单, 就是给个n, 算下面这个式子的值. $\sum\limits_{i=1}^{n-1} i \otimes (n-i)$ 重点是n的范围:2≤n<10500 比赛的时候 OEIS一下 ...
- HDU 4919 Exclusive or 数学
题意: 定义 \[f(n)=\sum\limits_{i=1}^{n-1}(i\oplus (n-i))\] 求\(f(n),n \leq 10^{500}\) 分析: 这个数列对应OEIS的A006 ...
- HDU 1710 二叉树的遍历 Binary Tree Traversals
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 4069 Squiggly Sudoku(DLX)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4069 Problem Description Today we play a squiggly sud ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
随机推荐
- LINUX怎么远程连接ORACLE数据库
A电脑装了ORACLE客户端,B是ORACLE服务器,都在LINUX环境下,请问A电脑怎么访问B上的数据库?该怎么改配置?求高手解答,越详细越好 很简单,你在A电脑安装一个ORACLE 客户端,然后, ...
- ASP.NET MVC 4 Ajax上传文件
这两天一直纠结着表单的问题.想在一个表单里实现三个功能: 输入查询条件,点击查询: 导出查询数据: 上传文件: 方法有很多,乱花渐欲迷人眼,尝试了很多,无果.大致说的是,给不同按钮写js代码,在js代 ...
- 读取Log日志并打印到sdcard
@SuppressLint("SimpleDateFormat") private static SimpleDateFormat sdf = new SimpleDateForm ...
- Hibernate - 使用注解完成映射
除了使用XML配置来映射对象和数据库表,还可以使用注解来完成持久化.使用注解需要导入Hibernate Annotations扩展包 @Entity -加在类的前面,将类声明为持久化类. -javax ...
- 读写锁ReadWriteLock和缓存实例
读写锁:多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥, ...
- Redhat和ubuntu的区别
风大神给了我一个完全基于 Linux 的操作系统ubuntu(乌班图)(是一个以桌面应用为主的Linux操作系统),当然作为linux,服务器应用都不会弱.,说是这个好用,可飞凌上资料用的居然是red ...
- mongodb使用mongoose分组查询
一个分组查询的例子: model.aggregate([{$match: ops}, {$unwind: '$details'}, {$sort: {create_at: -1}}, { $group ...
- js计算2个日期相差的天数,两个日期相差的天数,日期相隔天数
js计算2个日期相差的天数,两个日期相差的天数,日期相隔天数 >>>>>>>>>>>>>>>>>& ...
- ASP大数据量使用GetRows()提升速度
抽取10万条数据,Access数据库,GetRows() 现有10W条数据,Access数据库保存 通过正常提取: <% Set conn= Server.CreateObject(" ...
- DataBase 总结开篇
系列说明 本系列将总结(SQL)数据库技术在日常开发中引用,读者群体假设为三类:没接触过SQL的入门程序员.有过一两年经验的程序员.三年以上接触过性能调优的程序员.按照这个分类本系列大体分为三篇 第一 ...