题意:

给定n个正整数与a,b两个集合,求一种方案使得这n个数恰好被分在这两个集合中且集合中无多余的数且若x在a中则A-x在a中,若x在b中则B-x在b中。

题意理解了我好半天...

解法1:并查集。

把x, A - x,B - x(如果不存在B - x,x就不能放B集合)放入同一个并查集即可。

实现时注意一些乱七八糟的东西,大力讨论即可。

 #include <cstdio>
#include <map>
#include <cstring>
const int N = ; int a[N], ans[N], A, B, n, fa[N];
std::map<int, int> mp; inline int find(int x) {
if(x == fa[x]) {
return x;
}
return fa[x] = find(fa[x]);
}
inline bool check(int x, int y) {
return find(x) == find(y);
}
inline void merge(int x, int y) {
fa[find(x)] = find(y);
return;
} int main() {
memset(ans, -, sizeof(ans));
for(int i = ; i < N; i++) {
fa[i] = i;
}
scanf("%d%d%d", &n, &A, &B);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
mp[a[i]] = i;
}
for(int i = ; i <= n; i++) {
bool x = mp.find(A - a[i]) == mp.end();
bool y = mp.find(B - a[i]) == mp.end();
if(x && y) {
printf("NO");
return ;
}
else if(x) {
int &t = ans[mp[B - a[i]]];
if(t == ) {
printf("NO");
return ;
}
if(t == -) {
t = ;
}
ans[i] = ;
merge(i, mp[B - a[i]]);
}
else if(y) {
int &t = ans[mp[A - a[i]]];
if(t == ) {
printf("NO");
return ;
}
if(t == -) {
t = ;
}
ans[i] = ;
merge(i, mp[A - a[i]]);
}
else {
merge(i, mp[A - a[i]]);
merge(i, mp[B - a[i]]);
}
} for(int i = ; i <= n; i++) {
if(ans[i] == -) {
ans[i] = ans[find(i)];
}
else {
if(ans[find(i)] == -) {
ans[find(i)] = ans[i];
}
else if(ans[find(i)] != ans[i]) {
printf("NO");
return ;
}
}
}
printf("YES\n");
for(int i = ; i <= n; i++) {
if(ans[find(i)] == -) {
printf("0 ");
}
else {
printf("%d ", ans[find(i)]);
}
} return ;
}

AC代码

CF 468B Two Sets的更多相关文章

  1. CF 103E Buying Sets 最大权闭合子图,匹配 难度:4

    http://codeforces.com/problemset/problem/103/E 这道题首先一看就很像是最大权闭合子图,但是我们可以认为现在有两种点,数字和集合点,我们需要消除数字点的影响 ...

  2. Codeforces 468B Two Sets 并查集

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

  3. 算法笔记--2-sat

    强连通分量的应用,详见<挑战程序设计>P324 例题1:HDU Peaceful Commission 思路:强连通分量分解,看有没有两个同一个国家的代表在一个强连通分量里,如果有,就是N ...

  4. cf(#div1 B. Dreamoon and Sets)(数论)

    B. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. CF 1042 F. Leaf Sets

    F. Leaf Sets http://codeforces.com/contest/1042/problem/F 题意: 将所有的叶子节点分配到尽量少的集合,一个可行的集合中两两叶子节点的距离< ...

  6. cf B. Eight Point Sets

    http://codeforces.com/contest/334/problem/B #include <cstdio> #include <cstring> #includ ...

  7. cf Two Sets (我用二分最大匹配做的)

    题意: n个数p1,p2....pn     两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...

  8. CF下的BackgroudWorker组件优化.

    .net compact framwork(2.0/3.5)下没有Backgroundworder组件,在网上找了一个类 经过使用发现了一些问题,主要有一个问题:在一个Dowork事件中对Report ...

  9. spark MLlib 概念 4: 协同过滤(CF)

    1. 定义 协同过滤(Collaborative Filtering)有狭义和广义两种意义: 广义协同过滤:对来源不同的数据,根据他们的共同点做过滤处理. Collaborative filterin ...

随机推荐

  1. Quartz_配置

    quartz_jobs.xml job 任务 其实就是1.x版本中的<job-detail>,这个节点是用来定义每个具体的任务的,多个任务请创建多个job节点即可 name(必填) 任务名 ...

  2. Redis未授权访问漏洞的利用及防护

    Redis未授权访问漏洞的利用及防护 什么是Redis未授权访问漏洞? Redis在默认情况下,会绑定在0.0.0.0:6379.如果没有采取相关的安全策略,比如添加防火墙规则.避免其他非信任来源IP ...

  3. linux下用户操作记录审计环境的部署记录

    通常,我们运维管理人员需要知道一台服务器上有哪些用户登录过,在服务器上执行了哪些命令,干了哪些事情,这就要求记录服务器上所用登录用户的操作信息,这对于安全维护来说很有必要.废话不多说了,下面直接记录做 ...

  4. Docker容器学习梳理 - SSH方式登陆容器

    前面几篇已经介绍了Docker基础环境的部署,下面介绍下通过ssh方式登陆Docker容器的操作记录(其实不太建议直接用ssh去连接上容器的想法,虽然可以,但是有很多弊端,而且docker已经提供了容 ...

  5. Map获取key值

    有两种方法 public static void test4(){ Map<String, Object> map = new HashMap<>(); map.put(&qu ...

  6. 个人阅读作业2:结合《No Silver Bullet》谈谈我在软件开发过程的遇到的困难与体会

    英文捉急,只能挑一段看得比较懂的,而且正好和我们现在编程任务联系比较紧密的内容来谈一谈体会. 在<No Silver Bullet>中,作者描述了造成软件本质性困难(essence)的四个 ...

  7. 实验三 Java敏捷开发与xp实现

    实验内容: 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实 ...

  8. 1.个人项目 Individual Project

    https://github.com/sunlitao 一. 实验1通讯录管理系统 通讯录中的联系人包含以下信息项:姓名.手机.办公电话.家庭电话.电子邮箱.所在省市.工作单位.家庭住址,群组分类(亲 ...

  9. 软件工程第二次程序的作业:Java计算器实验

    1.计算器实验报告 2.https://github.com/lollipopangel/test/tree/master 3.实验截图 7+8 清除 六.总结 通过本次实验让我对JFrame类.JP ...

  10. Balanced Ternary String CodeForces - 1102D (贪心+思维)

    You are given a string ss consisting of exactly nn characters, and each character is either '0', '1' ...