codeforces 468B two set(并查集)
链接
题意
给两个集合A B,两个数a b,n个数x,分配n个数到两个集合,要求x , a-x在同一个集合,x , b-x在同一个集合,属于A集合的数输出0,B的输出1,无解输出NO,空集也算一个集合,所以存在所有数都在一个集合。
做法
这有一个样例
input
6 5 9
1 2 3 4 5 8
output
YES
1 0 0 1 1 1
[1 4]A,[4 5]
B,[1,8]
B,所以只能把1 4都放进B集合
首先,能在A里面处理的就放入A,否则放入B,能在B里面处理的就放入B,否则放入A,如果x只能在B出现然而b-x在A里面则把b-x拿来B,你是不是担心把b-x从A里拿掉了,那a-(b-x)岂不是没有配对了?如果是这样的话那就是不合法的呗,不然后面还会把a-(b-x)从A中拿给B的,如上面的样例。如果两个集合里有重复元素则不合法。
代码
#include<bits/stdc++.h>
using namespace std;
#define M 111000
int fa[M], num[M];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main() {
int n, a, b;
while (cin >> n >> a >> b) {
map<int, int> mp;
for (int i = 1; i <= n; i++) {
cin >> num[i];
mp[num[i]] = i;
}
for (int i = 1; i <= n + 2; i++)
fa[i] = i;
int x;
for (int i = 1; i <= n; i++) {
x = find(i);
if (mp[a - num[i]]) fa[x] = find(mp[a - num[i]]);//如果a-num[i]存在的话,则把num[i]和a-num[i]放进a集合
else fa[x] = find(n + 1);//否则放在b集合
x = find(i);//为什么不直接用上面的x,因为合并后fa[x]已经变化了
if (mp[b - num[i]]) fa[x] = find(mp[b - num[i]]);//如果b-num[i]存在的话,则把num[i]和b-num[i]放进b集合
else fa[x] = find(n + 2);//否则放在a集合
}
if (find(n + 1) == find(n + 2))//如果两个集合有重复元素则不合法
cout << "NO\n";
else {
cout << "YES\n";
printf("%d", find(1) == find(n + 1));
for (int i = 2; i <= n; i++)
printf(" %d", find(i) == find(n + 1));
cout << endl;
}
}
return 0;
}
codeforces 468B two set(并查集)的更多相关文章
- Codeforces 468B Two Sets 并查集
题目大意:给出n个数,要求将n个数分配到两个集合中,集合0中的元素x,要求A-x也再0中,同理1集合. 写了几个版本号,一直WA在第8组数据...最后參考下ans,写了并查集过了 学到:1.注意离散的 ...
- Codeforces Gym 100463E Spies 并查集
Spies Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Desc ...
- Codeforces 859E Desk Disorder 并查集找环,乘法原理
题目链接:http://codeforces.com/contest/859/problem/E 题意:有N个人.2N个座位.现在告诉你这N个人它们现在的座位.以及它们想去的座位.每个人可以去它们想去 ...
- Codeforces - 828C String Reconstruction —— 并查集find()函数
题目链接:http://codeforces.com/contest/828/problem/C C. String Reconstruction time limit per test 2 seco ...
- Codeforces 571D - Campus(并查集+线段树+DFS 序,hot tea)
Codeforces 题目传送门 & 洛谷题目传送门 看到集合的合并,可以本能地想到并查集. 不过这题的操作与传统意义上的并查集不太一样,传统意义上的并查集一般是用来判断连通性的,而此题还需支 ...
- CodeForces 455C Civilization (并查集+树的直径)
Civilization 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/B Description Andrew plays a ...
- Codeforces 650C Table Compression (并查集)
题意:M×N的矩阵 让你保持每行每列的大小对应关系不变,将矩阵重写,重写后的最大值最小. 思路:离散化思想+并查集,详见代码 好题! #include <iostream> #includ ...
- CodeForces - 893C Rumor【并查集】
<题目链接> 题目大意: 有n个人,其中有m对朋友,现在你有一个秘密你想告诉所有人,第i个人愿意出价a[i]买你的秘密,获得秘密的人会免费告诉它的所有朋友(他朋友的朋友也会免费知道),现在 ...
- CodeForces 566D Restructuring Company (并查集+链表)
题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中. 析:很容易知道是用并 ...
随机推荐
- PHP多进程初探 --- 利用多进程开发点儿东西吧
[原文地址:https://blog.ti-node.com/blog...] 干巴巴地叨逼叨了这么久,时候表演真正的技术了! 做个高端点儿的玩意吧,加入我们要做一个任务系统,这个系统可以在后台帮我们 ...
- Top English interview Q&A part 2.
https://www.zhihu.com/question/19666878 1.how do you handle failure? I have always lived by the maxi ...
- 权值线段树&线段树合并
权值线段树 所谓权值线段树,就是一种维护值而非下标的线段树,我个人倾向于称呼它为值域线段树. 举个栗子:对于一个给定的数组,普通线段树可以维护某个子数组中数的和,而权值线段树可以维护某个区间内数组元素 ...
- IPC总结学习
写的不错. http://www.cnblogs.com/CheeseZH/p/5264465.html IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket.S ...
- POJ 1625
什么鬼,真的是有负数的吗?我在字符加上了128才过了.dp[i][j],经过i步到达j状态的路径数.转移很容易了,建个trie图就可以,由前一步可连通到和更新即可. 另外,要用到大数和AC自动机DP ...
- 18124 N皇后问题
18124 N皇后问题 时间限制:2000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description 有N*N的国际象棋棋盘,要 ...
- Lightoj 1112 - Curious Robin Hood 【单点改动 + 单点、 区间查询】【树状数组 水题】
1112 - Curious Robin Hood PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 MB ...
- java 线程死锁的检测
java 线程死锁的检测 例子程序: import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executo ...
- Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2]
Setting up a EDK II build environment on Windows and Linux:搭建Windows和Linux开发环境[2.2] 2015-07 北京海淀区 ...
- poj3621 Sightseeing Cows
01分数规划 二分+spfa负环(SLF优化) #include<cstdio> #include<iostream> #include<cstring> #inc ...