题意:

对于n个数a[0]~a[n-1],但你不知道它们的值,通过逐步提供给你的信息,你的任务是根据这些信息回答问题:
I P V :告诉你a[P] = V
I P Q V:告诉你a[P] XOR a[Q] = V
Q K P1..PK:询问a[P1]^a[P2]^...a[PK]的值
n<=20000

题解:
 
首先看前两个操作:
第一个操作我们可以新加一个节点a[n]=0,则a[p]=val转化为a[p]^a[n]=val。
那么所有知道值的点必定都与a[n]在同一个并查集之内。
 
我们可以用带权并查集,对每个点x维护fa[x],d[x]是a[x]^a[fa[x]]。
对与第三个操作,我们可以发现p1,p2,...,pk必定在某几个并查集之中。
如果某个并查集中有奇数个p,那就相当于a[p1]^a[p2]^..a[px] ^ 奇数次a[根](异或一个数偶数次相当于没有异或它)。
如果根不是a[n],也就是根的值未知,那么必定是不确定答案的。
否则我们就可以直接算出。

注意合并的时候如果有一个是a[n]所在集合,要让a[n]为根。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<ctime>
using namespace std; const int N=;
int n,m,fa[N],d[N],cnt[N],q[N];
char s[]; int findfa(int x)
{
if(fa[x]!=x)
{
int xx=fa[x];
fa[x]=findfa(fa[x]);
d[x]=d[x]^d[xx];
}
return fa[x];
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
char ch;
int x,y,k,p,xx,yy,val,ans,bk,ok,num,T=;
while()
{
scanf("%d%d",&n,&m);
if(!n && !m) break;
printf("Case %d:\n",++T);
memset(cnt,,sizeof(cnt));
for(int i=;i<=n;i++) fa[i]=i,d[i]=;
num=;bk=;
for(int i=;i<=m;i++)
{
scanf("%s",s);
if(s[]=='I')
{
num++;
scanf("%d%d%c",&x,&y,&ch);
if(ch==' ') scanf("%d",&val);
else val=y,y=n;
if(!bk) continue;
xx=findfa(x);yy=findfa(y);
if(xx!=yy)
{
if(xx==n) swap(x,y),swap(xx,yy);//debug
fa[xx]=y;
d[xx]=val^d[x];
}
else if((d[x]^d[y])!=val) {printf("The first %d facts are conflicting.\n",num);bk=;}
}
else
{
scanf("%d",&k);
for(int j=;j<=k;j++)
{
scanf("%d",&q[j]);
findfa(q[j]);
cnt[fa[q[j]]]++;
}
if(!bk) continue;
ans=;ok=;
for(int j=;j<=k;j++)
{
x=q[j];
if(fa[x]!=n && (cnt[fa[x]]&)) {printf("I don't know.\n");ok=;break;}
ans^=d[x];
}
for(int j=;j<=k;j++) cnt[fa[q[j]]]--;
if(ok) printf("%d\n",ans);
}
// printf("i = %d\n",i);
// for(int j=0;j<n;j++) printf("%d fa = %d d = %d\n",j,fa[j],d[j]);
// printf("\n");
}
printf("\n");
}
return ;
}
 

【uva12232/hdu3461】带权并查集维护异或值的更多相关文章

  1. 【POJ1182】 食物链 (带权并查集)

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  2. BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]

    题意: 给出m个区间和,询问是否有区间和和之前给出的矛盾 NOIp之前做过hdu3038..... 带权并查集维护到根的权值和,向左合并 #include <iostream> #incl ...

  3. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并

    原文链接http://www.cnblogs.com/zhouzhendong/p/8683831.html 题目传送门 - BZOJ4025 题意 有$n$个点,有$m$条边.有$T$个时间段.其中 ...

  4. BZOJ4602 Sdoi2016 齿轮 【带权并查集】*

    BZOJ4602 Sdoi2016 齿轮 Description 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y.即如果只考虑这两个组 ...

  5. HDU3047 Zjnu Stadium 【带权并查集】

    HDU3047 Zjnu Stadium Problem Description In 12th Zhejiang College Students Games 2007, there was a n ...

  6. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  7. 【bzoj4500】矩阵 带权并查集

    题目描述 有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作: 1. 选择一行, 该行每个格子的权值加1或减1. 2. 选择一列, 该列每个格子的权值加1或减1. 现在有K个限制,每 ...

  8. Poj1733 Parity Game(带权并查集)

    题面 Poj 题解 反正只要你判断是否满足区间的奇偶性,假设每一位要么是\(1\)要么是\(0\)好了. 假设有\(S\)的前缀和为\(sum[]\),则有: 若\(S[l...r]\)中有奇数个\( ...

  9. 【带权并查集】【离散化】vijos P1112 小胖的奇偶

    每个区间拆成r和l-1两个端点,若之内有偶数个1,则这两个端点对应的前缀的奇偶性必须相同,否则必须相反. 于是可以用带权并查集维护,每个结点储存其与其父节点的奇偶性是否相同,并且在路径压缩以及Unio ...

随机推荐

  1. Java实验二实验报告:java面向对象程序设计

    java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验 ...

  2. mysql 只返回一条数据

    问题描述: 需要得到时间最近的一条记录,但是按照时间字段排完序之后,得到的是全部. 解决办法: order by createtime desc //降序:asc:升序 LIMIT 1

  3. Hibernate使用详解(一)

    一.前言 这些天都在为公司框架重构做准备,浏览了一下代码,挑了几个不熟或者没接触过的知识点进行攻坚,hibernate是其中之一.其实接触hibernate是在大学期间,应该是在2012年,已经201 ...

  4. [OS] 多线程--原子操作 Interlocked系列函数

    转自:http://blog.csdn.net/morewindows/article/details/7429155 上一篇<多线程--第一次亲密接触 CreateThread与_begint ...

  5. codeforces 985 E. Pencils and Boxes (dp 树状数组)

    E. Pencils and Boxes time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  6. connectedSignal 简单使用

    import java.util.concurrent.CountDownLatch; public class CountDown { private static CountDownLatch c ...

  7. bzoj3998-弦论

    给定一个长度为\(n(n\le 5\times 10^5)\)的字符串,求它的第\(k\)小字串.有两种模式: \(Type=0\),不同位置的相同字串只算一个 \(Type=1\),不同位置相同字串 ...

  8. 【题解】51nod 1203JZPLCM问题

    这题好强强啊,貌似是集训队原题?集训队原题当中值域是1e9的范围,这样各种乱搞是妥妥的不能过了,只能写正解的离线+树状数组维护前缀积. 最开始我写了几种乱搞做法,包括莫队和线段树做法.其中表现比较优秀 ...

  9. SPOJ694/DISUBSTR:Distinct Substrings——题解

    https://vjudge.net/problem/SPOJ-DISUBSTR https://www.luogu.org/problemnew/show/SP694 http://www.spoj ...

  10. MySQL中数据表的基本操纵

    本文基于对国家863中部软件孵化器编著的<MySQL从入门到精通>一书的操作实践.  一.创建数据表 数据表属于数据库,在创建数据表之前,应该使用语句 USE 数据库名  指定操作是在那个 ...