题目链接:点击查看

题目大意:现在给出两个集合A和B,再给出两个数a和b,现在规定在集合A中的数x必须满足x和a-x同时在集合a中,而在集合B中的数x也同样需要满足x和b-x同时在集合B中,现在给出一系列数,问能否将所有的数都分配到两个集合中去

题目分析:这个题因为放在了二分图的专题里,所以一开始想尽了一切办法想将这个题目往匈牙利上靠拢,但最终没办法将模型抽象出来,看了题解后才知道是个简单并查集的题目,这里分析一下吧,对于任意一个x,无非只有四种情况:

  1. a-x不存在,b-x不存在:输出NO
  2. a-x存在,b-x不存在:将x放到集合A中
  3. a-x不存在,b-x存在:将x放到集合B中
  4. a-x存在,b-x存在:将x放到集合A和集合B中

因为给出的n个数两两都是不同的,并且都是正整数,所以我们可以在一开始的时候就剪一下枝,如果数列中的最大值大于等于a或b中的最大值显然是输出NO的,因为这个时候无论是a还是b,减去这个最大值一定是一个负数,肯定找不到与其对应的一个正整数,这种情况可以归类为上面所述的第一种情况

我们维护1~n为数列,然后0为集合A,n+1为集合B,在输入的时候就用map维护每个数的下标,最后遍历一遍,按照上述的2-4规则用并查集维护一下下标,将x和a-x建边或x和b-x建边,最后判断即可

该怎么判断呢?因为如果满足了第一种情况,也就是a-x和b-x在数列中都不存在的话,那么这个数肯定被else判断到了两个集合中去了,也就是将点0和点n+1建了一条边,第二种情况和第三种情况都会根据巧妙的逻辑将其与相应的集合建边,不重不漏,最后如果都存在的话,则只会先将这三个点:x,a-x,b-x三点建边,等到后续判断a-x的时候,以及b-x的时候,再利用else的逻辑将其与相应集合建边

不得不佩服这个题的思维逻辑

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int val[N];unordered_map<int,int>pos;int f[N];int find(int x)
{return x==f[x]?x:f[x]=find(f[x]);
}void merge(int x,int y)
{int xx=find(x);int yy=find(y);f[xx]=yy;
}int main()
{
//  freopen("input.txt","r",stdin);
//    ios::sync_with_stdio(false);int n,a,b;scanf("%d%d%d",&n,&a,&b);int mmax=0;for(int i=1;i<=n;i++){scanf("%d",val+i);pos[val[i]]=i;mmax=max(mmax,val[i]);}if(mmax>=max(a,b))return 0*printf("NO\n");for(int i=0;i<=n+1;i++)f[i]=i;for(int i=1;i<=n;i++){if(pos[a-val[i]])//如果x与a-x有对应,就建边merge(i,pos[a-val[i]]);else//否则将x加入到集合B中去merge(i,n+1);if(pos[b-val[i]])//如果x与b-x有对应,就建边merge(i,pos[b-val[i]]);else//否则将x加入到集合A中去merge(i,0);}int A=find(0);int B=find(n+1);if(A==B)printf("NO\n");else{printf("YES\n");for(int i=1;i<=n;i++){if(find(i)==A)printf("0");elseprintf("1");if(i!=n)putchar(' ');elseputchar('\n');}}return 0;
}

CodeForces - 468B Two Sets(并查集+思维)相关推荐

  1. Codeforces 200A Cinema 并查集 + 思维 (看题解)

    Cinema 感觉这个题好神啊... 首先如果 n 比 m 大, 我们先旋转90度. 我们要加入一个(x, y)的时候, 我们枚举答案所在的行离 x 的距离 g , 然后对于x + g 行来说 我们找 ...

  2. gym:Problem A Artwork(并查集思维题)

    20162017-acmicpc-nordic-collegiate-programming-contest-ncpc-2016 Problem A Artwork 题目链接 http://codef ...

  3. CodeForces - 123A prime permutation(并查集,水题)

    题目链接:点击查看 题目大意:给出一个字符串s,问能否通过重组其字母顺序,从而满足:若字符串下标从1开始,对于每一个质数下标,满足 题目分析:其实在纸上稍微写写画画就能看出个大概的规律,当字符串的长度 ...

  4. All men are brothers(并查集+思维 好题!!!)

    链接:https://ac.nowcoder.com/acm/contest/889/E 来源:牛客网 Amy asks Mr. B problem E. Please help Mr. B to s ...

  5. codeforces 884E Binary Matrix 并查集,滚动数组

    E. Binary Matrix time limit per test 3 seconds memory limit per test 16 megabytes input standard inp ...

  6. Codeforces 1144D Deduction Queries 并查集

    Deduction Queries 用并查集维护前缀的关系, 在同一个联通块内两两之间的异或值都是已知的. 每个点再维护一个和它当前父亲的异或值, 压缩路径的时候更新一下就好了. #include&l ...

  7. Codeforces 371D. Vessels【并查集】

    题目大意: 给出一堆从上到下叠起来的容器,有两种操作:第一种是在编号为i的容器中加入x的水(保证水溢出之后会流到下一个最近的容器(如果存在)中):第二种是查询编号为i的容器中有多少水. 做法: 首先, ...

  8. 2020牛客暑期多校训练营(第八场)I-Interesting Computer Game(并查集 + 思维)

    链接: I-Interesting Computer Game 题意: 给出 n 组 a,b,每次可以选择 a 或者选择 b ,问做多可以选多少个不同的数. 思路: 考虑每个连通块 , 如果是 n 个 ...

  9. upc 潜入苏拉玛 多源bfs + 并查集 + 思维

    潜入苏拉玛 时间限制: 1 Sec 内存限制: 128 MB 题目描述 你接到了⼀个任务,让你潜⼊苏拉玛城,和线⼈取得联络.苏拉玛的地图是⼀张N个点M条边的⽆向图,每个点表⽰苏拉玛城的⼀个路⼜,每条边 ...

最新文章

  1. Android应用在不同版本间兼容性处理
  2. hive中如何读取数组_hive解析json嵌套数组
  3. LeetCode:贪婪算法
  4. 快速排序到底有多快?
  5. Educational Codeforces Round 112 E.Boring Segments-线段树+双指针
  6. 大公司程序员 VS 小公司程序员 | 差别在哪?
  7. 阿里公布碳中和目标:2030年带动生态 15年减碳15亿吨
  8. 关于一个GetLevelDesc函数 的认知问题
  9. hadoop1.0集群搭建
  10. [藏]常用的匹配正则表达式和实例
  11. 【测试报告】模板:性能测试报告 2
  12. Kubernetes Pod健康检查-livenessProbe和readinessProbe
  13. 《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》论文笔记
  14. 柳 to 杨 (转)
  15. origin matlab 数据,数据拟合确定参数,可以用matlab、origin等软件,求结果。
  16. 北京理工大学 计算机学院 李侃,李侃(北京理工大学教授李侃)_百度百科
  17. 2021-11-03如何删除文件夹名中间有【空格】及后边带有“..”的文件夹
  18. SQL Server Table Spool优化
  19. 快上车,老司机带你实现后台录像功能
  20. V4L2_Utils目标平台编译

热门文章

  1. Jetty 与 Tomcat 比较,及性能分析
  2. Spring中Bean的生命周期是怎样的?
  3. 手写自己的MyBatis框架-这个框架需要解决什么问题?
  4. 当开启了延迟加载的开关,对象是怎么变成代理对象的?
  5. 完成DI 依赖注入功能
  6. 品牌管理-统一异常处理
  7. 引导类、扩展类、系统类加载器的使用及演示
  8. 反射获取有参数的构造方法并运行
  9. 七牛云存储:通过SDK上传图片
  10. 列表-使用del关键字从列表删除数据