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.且该组后面的操作直接忽略;

Sample Input (只是一组)
2 6
I 0 1 3
Q 1 0
Q 2 1 0
I 0 2
Q 1 1
Q 1 0

0 0

Sample Output
Case 1:
I don't know.
3
1
2
 
思路:根据压缩路径的同时可以得到每个子节点到根节点的XOR的相对值;即XOR[i] = XOR[i] ^ XOR[root];将该异或结果存储在子节点中。当根节点未知时,不能确定子节点的值;但是根据XOR的特性可知,当子节点的个数为偶数时,就可以将根节点消去,这就是在求解Q 操作时,对于每个id[]都是分集合(同根节点)求解的。此题有一个区别就是可以根据I操作知道若干个节点的值,并且可以根据XOR的关系推出其他节点的值。这个特性甚是无语啊。。(难点)那么是否就需要另外存储每一个节点的值?这么想会发现很复杂,因为这脱离了并查集;每次需要判断是否是确定值,并且之间的推断感觉不好编码,这是需要转化为并查集;
 
构造:构造出一个节点n,表示所有已知值的根节点;这时可以将已知节点的值直接看成是该节点与根节点n的XOR值,和未知值节点的共性;
细节:对于在_union()中,判断fa是否为n,这一点是为了维护n一定是已知值节点的根节点;不能认为a反正不会是n,而去除;
 
code是参考了ACM_cxlove (是我网上看到除了notonlySuccess的线段树之外,写得最好的code,顶一个,风格和我差不多。。)后自己写的;痕迹明显。。
 
#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的更多相关文章

  1. HDU 4919 Exclusive or (数论 or 打表找规律)

    Exclusive or 题目链接: http://acm.hust.edu.cn/vjudge/contest/121336#problem/J Description Given n, find ...

  2. hdu 4919 Exclusive or

    Exclusive or Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) T ...

  3. hdu 3234 Exclusive-OR (并查集)

    Problem - 3234 题意不难理解,就是给出一些断言,以及一些查询,回答查询或者在找到断言矛盾以后沉默不做任何事. 这题其实就是一个并查集的距离存储问题,只要记录并查集元素的相对值以及绝对值就 ...

  4. hdu 3234 并查集

    虚拟一个根节点n,设其值为0.并且始终保持其为根. #include<map> #include<set> #include<cmath> #include< ...

  5. [JAVA]HDU 4919 Exclusive or

    题意很简单, 就是给个n, 算下面这个式子的值. $\sum\limits_{i=1}^{n-1} i \otimes (n-i)$ 重点是n的范围:2≤n<10500 比赛的时候 OEIS一下 ...

  6. HDU 4919 Exclusive or 数学

    题意: 定义 \[f(n)=\sum\limits_{i=1}^{n-1}(i\oplus (n-i))\] 求\(f(n),n \leq 10^{500}\) 分析: 这个数列对应OEIS的A006 ...

  7. HDU 1710 二叉树的遍历 Binary Tree Traversals

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. 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 ...

  9. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

随机推荐

  1. Helpers\Date

    Helpers\Date The Date helper is used for calculations with dates. Date::difference($from, $to, $type ...

  2. 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 ...

  3. 数据结果与算法分析(1)——算法分析

          在确定一个算法正确的同时,也要保证算法的有效性.算法分析的最重要的标准时运行时间T(N),运行时间与输入元素个数N有关. 数学基础         T(N) = O(f(N)) 表示T(N ...

  4. java编程常用技术

    一:将String字符串放在最前面 防止发生NullPointerException异常,我们通常把String字符串放在equals方法的左边来比较,这样可以有效的避免 空指针异常的发生. 第一种情 ...

  5. [转]oracle odp.net 32位/64位版本的问题

    本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...

  6. 关于git fetch 和git pull 的区别

    1.fetch 相当于是从远程获取最新版本呢到本地,不会自动merge. git fetch origin master:tmpgit diff tmp git merge tmp 2. git pu ...

  7. 如何在ANDROID JNI 的C++中打Log

    http://blog.csdn.net/pkigavin/article/details/8583537 最近在研究Android 2.3.3源代码的C/C++层,需要对代码进行一些调试,但是奇怪的 ...

  8. asp.net中一般处理程序中添加session

    asp.net中使用一般处理程序(.ashx)添加session,利用context.session["xxx"] = value的方式把值保存到session:运行的时候会出现该 ...

  9. ERwin 连接 mysql

    1. install mysql connector; 2. run odbc connection management (c:\windows\syswow64\odbcad32.exe); 3. ...

  10. xadmin学习笔记(一)——编程准备

    前言 xadmin是GitHub上的开源项目,它是Django admin的超强升级版,提供了强大的插件系统,丰富的内置功能,以及无与伦比的UI主题,使管理系统的实现变得异常简单.详情请参见官方网址. ...