题意:

对于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. lol人物模型提取(七)

      9月13号我就把上了贴图的模型文件发了过去,到9月18号他们那的颜色就上好了,一个叫"3d打印旗舰店"的人加了我微信并拍了几张照片发了给我,效果图如下:   第一眼看上去我还是 ...

  2. PAT L2-028 秀恩爱分得快

    https://pintia.cn/problem-sets/994805046380707840/problems/994805054698012672 古人云:秀恩爱,分得快. 互联网上每天都有大 ...

  3. phpcms添加自定义字段

    设置 :后台 ---  内容 ---- 模型管理  ---- 对应的模型 ---  字段管理 新增加自定义字段:phpcms123 调用新增字段代码:   {pc:content action=&qu ...

  4. phpcms 本地环境调试缓慢 解决办法

    用记事本打开host文件,(文件位置,windows下一般在路径C:\Windows\System32\drivers\etc下)找到#127.0.0.1      localhost 这一句  去掉 ...

  5. shiro学习详解(开篇)

    一.前言 要开始接触公司另外一个项目了,RX和我说了下整个项目框架的结构,其中提到权限的控制是通过shiro来处理的,对我而言又是一个全新的知识点,于是今天花了一点时间去学习shiro的使用,看了好几 ...

  6. 从一个ListBox中的元素点击导入另一个ListBox元素中

    先看效果图:

  7. matlab eval【转】

    Matlab 简单谈谈EVAL函数的用法 EVAL(s)相当于把字符串s的内容作为语句来执行. 比如:eval('a=3*5') 和直接在command 窗口中输入 a=3*5 等效 eval 一个经 ...

  8. 【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法

    题目描述 那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛的加密方法.由于她们并不是经验十足,她们的加密方法非常简单:第i只奶牛掌握着密码的第i个数字,起始的时候是Ci(0≤C ...

  9. Go语言【第十一篇】:Go数据结构之:结构体

    Go语言结构体 Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型,结构体是由一系列具有相同类型或不同类型数据构成的集合.结构体表示一项记录,比如:保存图书馆的书籍记 ...

  10. sql批量更新关系型数据库

    更改gb_groupd里的chargingrulesname的值UPDATE   tb_group SET tb_group.chargingrulesname =tb_chargingrules.c ...