链接

B. Two Sets

题意

给两个集合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(并查集)的更多相关文章

  1. Codeforces 468B Two Sets 并查集

    题目大意:给出n个数,要求将n个数分配到两个集合中,集合0中的元素x,要求A-x也再0中,同理1集合. 写了几个版本号,一直WA在第8组数据...最后參考下ans,写了并查集过了 学到:1.注意离散的 ...

  2. Codeforces Gym 100463E Spies 并查集

    Spies Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Desc ...

  3. Codeforces 859E Desk Disorder 并查集找环,乘法原理

    题目链接:http://codeforces.com/contest/859/problem/E 题意:有N个人.2N个座位.现在告诉你这N个人它们现在的座位.以及它们想去的座位.每个人可以去它们想去 ...

  4. Codeforces - 828C String Reconstruction —— 并查集find()函数

    题目链接:http://codeforces.com/contest/828/problem/C C. String Reconstruction time limit per test 2 seco ...

  5. Codeforces 571D - Campus(并查集+线段树+DFS 序,hot tea)

    Codeforces 题目传送门 & 洛谷题目传送门 看到集合的合并,可以本能地想到并查集. 不过这题的操作与传统意义上的并查集不太一样,传统意义上的并查集一般是用来判断连通性的,而此题还需支 ...

  6. CodeForces 455C Civilization (并查集+树的直径)

    Civilization 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/B Description Andrew plays a ...

  7. Codeforces 650C Table Compression (并查集)

    题意:M×N的矩阵 让你保持每行每列的大小对应关系不变,将矩阵重写,重写后的最大值最小. 思路:离散化思想+并查集,详见代码 好题! #include <iostream> #includ ...

  8. CodeForces - 893C Rumor【并查集】

    <题目链接> 题目大意: 有n个人,其中有m对朋友,现在你有一个秘密你想告诉所有人,第i个人愿意出价a[i]买你的秘密,获得秘密的人会免费告诉它的所有朋友(他朋友的朋友也会免费知道),现在 ...

  9. CodeForces 566D Restructuring Company (并查集+链表)

    题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中. 析:很容易知道是用并 ...

随机推荐

  1. PAT 1079. Total Sales of Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  2. 【codeforces 798C】Mike and gcd problem

    [题目链接]:http://codeforces.com/contest/798/problem/C [题意] 给你n个数字; 要求你进行若干次操作; 每次操作对第i和第i+1个位置的数字进行; 将 ...

  3. (15)Spring Boot使用Druid和监控配置【从零开始学Spring Boot】

    Spring Boot 系列博客] 更多查看博客:http://412887952-qq-com.iteye.com/blog Spring Boot默认的数据源是:org.apache.tomcat ...

  4. 1013MySQL监控利器-Innotop

    转自 http://www.cnblogs.com/ivictor/p/5101506.html 安装过程中 可以使用 YUM INSTALL INNOTOP进行直接安装 Innotop是一款十分强大 ...

  5. spring mvc中的@propertysource

    在spring mvc中,在配置文件中的东西,可以在java代码中通过注解进行读取了: @PropertySource  在spring 3.1中开始引入 比如有配置文件 config.propert ...

  6. POJ 3130

    这题,加了精度错了,不加精度反而对了... #include <iostream> #include <cstdio> #include <cstring> #in ...

  7. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第六步--金币&amp;岩石加入而且管理

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  8. Linux 强行终止

    kill -9 pid pid是进程号 -9 代表的是数字 INT 2 这个就是你在bash下面用Ctrl+C 来结束一个程序时,bash会向进程发送这个信号,默认的,进程收到这个程序会结束. 你可以 ...

  9. Codeforces Beta Round #95 (Div. 2) D. Subway 边双联通+spfa

    D. Subway   A subway scheme, classic for all Berland cities is represented by a set of n stations co ...

  10. luogu1890 gcd区间

    题目大意:给定一行n个正整数a[1]..a[n].m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 因为gcd满足交换律和结合律,所以用线段树维护区间上的gcd值即可. ...