hdu3234 Exclusive-OR(带权并查集)
题目
题目叙述来自思路来源,懒得敲了2333……
思路来源
https://blog.csdn.net/XY20130630/article/details/50638922
题解
考虑,把Xp XOR Xq=v这样的关系建成边,不妨p为root,则q与其相连,且置q的置为v,代表一种相对关系
后续,带权并查集维护的,也都是到祖先的这条链的异或值
Xp=v的一类型操作,将其视为Xp XOR 0=v,
由于原先的点的下标为0到n-1,则建一个虚点n,作一类型的0点,
考虑合并过程,如果相同祖先,但是到根的距离不满足差z的关系,则不合法
否则合法,按带权并查集的思想,若将px合并到py上去,
则将px的距离用py->y y->x x->px的关系,重新定义px的值
然后考虑询问,对每一堆相同rt的单独考虑,不同root的互不影响
不妨设x1,x2,...,xm的根相同,则由于每个值v[xi]是与根root的异或值,
最后的答案是,
如果root的个数为偶,显然是可以消掉的;
为奇的话,由于root的值可以改变式子的值,故此时答案不唯一
具体实现的时候,特判一下root是不是虚点n
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+10,M=300,K=20;
int n,q,k,x,y,z,par[N],v[N],ask[K];
char s[N];
bool vis[K];
void init(int n){for(int i=0;i<=n;++i){par[i]=i;v[i]=0;}
}
int find(int x){if(par[x]==x)return x;int fa=par[x];//直接基类par[x]=find(par[x]);//路径压缩v[x]^=v[fa];//树上前缀和 两链变一链 直接连树根return par[x];//返回树根
}
//y^x=z
bool unite(int x,int y,int z){int px=find(x),py=find(y);if(px==py){if((v[x]^v[y])!=z)return 0;return 1;}if(px==n){//n为不动点 只能为根swap(px,py);}par[px]=py;v[px]=v[y]^z^v[x];return 1;
}
int query(){int fa,ans=0,num;for(int i=1;i<=k;++i){if(vis[i])continue;vis[i]=1;fa=find(ask[i]);ans^=v[ask[i]];num=1;for(int j=i+1;j<=k;++j){if(vis[j])continue;if(find(ask[j])==fa){vis[j]=1;ans^=v[ask[j]];num++;}}if((num&1) && fa!=n){return -1;}}return ans;
}
int main(){int c=0;while(~scanf("%d%d",&n,&q)){if(!n && !q)break;bool non=false;int fac=0;init(n);printf("Case %d:\n",++c);while(q--){scanf("%s",s);if(s[0]=='I'){fac++;getchar();fgets(s,250,stdin);int sp=0;//spacefor(int i=0;s[i];++i){sp+=(s[i]==' ');}if(sp==1){sscanf(s,"%d%d",&x,&z);y=n;}else{sscanf(s,"%d%d%d",&x,&y,&z);}if(non)continue;if(!unite(x,y,z)){printf("The first %d facts are conflicting.\n",fac);non=true;}}else{scanf("%d",&k);for(int i=1;i<=k;++i){vis[i]=0;scanf("%d",&ask[i]);}if(non)continue;int ans=query();if(ans==-1)puts("I don't know.");else printf("%d\n",ans);}}puts("");}return 0;
}
hdu3234 Exclusive-OR(带权并查集)相关推荐
- hdu3234 带权并查集(XOR)
题意: 给你n个未知的正整数,有三总操作 I P V P的值是V I P Q V P XOR Q = V Q K ...
- HDU-3234 Exclusive-OR 异或带权并查集
题目描述 现在有n个数,X0,X1,-,Xn-1,你并不知道这n个数的大小,然后接下来有Q个询问,询问的格式如下 1) I p v, 告诉你 Xp = v 2) I p q v, 告诉你 Xp ^ X ...
- 2017乌鲁木齐ICPC: I. A Possible Tree(带权并查集)
I. A Possible Tree Alice knows that Bob has a secret tree (in terms of graph theory) with n nodes wi ...
- 2017乌鲁木齐区域赛I(带权并查集)
#include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...
- BZOJ 2303 方格染色(带权并查集)
要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...
- POJ1703带权并查集(距离或者异或)
题意: 有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派 ...
- POJ1988(带权并查集,搬砖块)
题意: 可以这样理解,有n快方形积木,一开始都是单独的放到哪,然后有两种操作 1 M a b 把a所在的那一堆落到b所在那一堆的上面(一开始自己是一堆) 2 C a 问a下面有多少个积木 ...
- LA3027简单带权并查集
题意: 有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...
- hdu4829 带权并查集(题目不错)
题意: Information Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
最新文章
- 如何征服Webpack 4并构建一个出色的React应用
- GNU make manual 翻译( 一百八十三)
- mysql选择索引逻辑_Mysql索引选择逻辑
- 时序轮转的意思_天地是景框时序轮转的风景----(傻女人)
- 自然语言处理 —— 2.2 使用词嵌入
- mysql5.7复制集_技术分享 | 克隆:更优雅的创建 MySQL 实例副本
- 文本文件 java_Java入门:读写文本文件
- python自定义函数如何命名_Python 自定义类之函数和运算符重载
- 计算机子网掩码在线,IP地址计算器
- 树莓派linux系统识别u盘启动,U盘安装树莓派系统,利用U盘启动Raspberry
- 微信小程序图片显示模式
- 线上软文自媒体推广怎么做,软文推广有什么好处?
- 用python制作英文字典的分析_分享一个自己做的英文科学写作检查器
- 《少年pi》:每个人心中都有一只孟…
- 你有花生我有酒,一本学道看一天(二)
- 用c语言对图像进行模板匹配,[转载]模板匹配的基本概念
- unity保存游戏对象到mysql_Unity实现游戏存档框架
- 新来个技术总监要我做一个 IP 属地功能~
- Jupyter Notebook(Anaconda)【快捷键】
- 表格渲染 解决BootStrap3徽章没有背景颜色的问题(BootStrap4有)