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 =============================以下是最小生成树+并 ...
随机推荐
- Helpers\Date
Helpers\Date The Date helper is used for calculations with dates. Date::difference($from, $to, $type ...
- Porsche Piwis Tester II “No VCI has been detected”,how to do?
Hi,Joy, I am sorry that my Porsche Piwis Tester II from your shop said “No VCI has been detected” wh ...
- 数据结果与算法分析(1)——算法分析
在确定一个算法正确的同时,也要保证算法的有效性.算法分析的最重要的标准时运行时间T(N),运行时间与输入元素个数N有关. 数学基础 T(N) = O(f(N)) 表示T(N ...
- java编程常用技术
一:将String字符串放在最前面 防止发生NullPointerException异常,我们通常把String字符串放在equals方法的左边来比较,这样可以有效的避免 空指针异常的发生. 第一种情 ...
- [转]oracle odp.net 32位/64位版本的问题
本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...
- 关于git fetch 和git pull 的区别
1.fetch 相当于是从远程获取最新版本呢到本地,不会自动merge. git fetch origin master:tmpgit diff tmp git merge tmp 2. git pu ...
- 如何在ANDROID JNI 的C++中打Log
http://blog.csdn.net/pkigavin/article/details/8583537 最近在研究Android 2.3.3源代码的C/C++层,需要对代码进行一些调试,但是奇怪的 ...
- asp.net中一般处理程序中添加session
asp.net中使用一般处理程序(.ashx)添加session,利用context.session["xxx"] = value的方式把值保存到session:运行的时候会出现该 ...
- ERwin 连接 mysql
1. install mysql connector; 2. run odbc connection management (c:\windows\syswow64\odbcad32.exe); 3. ...
- xadmin学习笔记(一)——编程准备
前言 xadmin是GitHub上的开源项目,它是Django admin的超强升级版,提供了强大的插件系统,丰富的内置功能,以及无与伦比的UI主题,使管理系统的实现变得异常简单.详情请参见官方网址. ...