题意:

给定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. Python-注册登陆-20

    username = input('请输入你要注册的用户名:') password = input('请输入你要注册的密码:') with open('list_of_info',mode='w',e ...

  2. Linux基础实践

    Linux基础实践 1.1 应用安装 要求:掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法 备份原地址列表文件:sudo cp /etc/apt/sou ...

  3. python 使用spaCy 进行NLP处理

    原文:http://mp.weixin.qq.com/s/sqa-Ca2oXhvcPHJKg9PuVg import spacy nlp = spacy.load("en_core_web_ ...

  4. 第二次sprint

    一.这次冲刺就是实施阶段了,主要对程序进行一次骨架的构建,基本上已经完成了界面的设计,但是在算法上还有很大漏洞,整个程序还是属于不成熟阶段. 二.这是我们的界面 三.已经有的功能:随机生成题目并算出答 ...

  5. Daily Scrum- 12/28

    Meeting Minutes 讨论alpha 的feed back; 决定添加按钮向下的动作,作为feature; 完成了界面的微调,开始使用alpha.1进行feed back的收集 Burndo ...

  6. Beta阶段敏捷冲刺三

    一.举行站立式会议 1.当天站立式会议照片一张 2.团队成员报告 林楚虹 (1) 昨天已完成的工作:从数据库读取单词 (2) 今天计划完成的工作:在数据库单词表导入完整数据,完善select.js ( ...

  7. ES6.0简单了解

    Case 1:let.const var的缺陷 1.可以重复声明变量 2.无法限制修改(没有常量) 3.没有块级作用域 let和const可以弥补var的缺陷 let: 不能重复声明,用来声明变量,声 ...

  8. Windows samba history

    https://blogs.technet.microsoft.com/josebda/2013/10/02/windows-server-2012-r2-which-version-of-the-s ...

  9. how-is-docker-different-from-a-normal-virtual-machine[Docker与VirtualMachine的区别]

    https://stackoverflow.com/questions/16047306/how-is-docker-different-from-a-normal-virtual-machine 被 ...

  10. Sqlite,libevent,openssl,mosquito交叉编译

    一.设置交叉编译环境 在makefile所在目录(或源代码根目录)打开终端. 在终端中设置交叉编译所需的临时环境变量(也可写到配置文件中设置为全局环境变量),其中交叉编译工具链的名称和目录需要根据实际 ...