CF 468B Two Sets
题意:
给定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的更多相关文章
- CF 103E Buying Sets 最大权闭合子图,匹配 难度:4
http://codeforces.com/problemset/problem/103/E 这道题首先一看就很像是最大权闭合子图,但是我们可以认为现在有两种点,数字和集合点,我们需要消除数字点的影响 ...
- Codeforces 468B Two Sets 并查集
题目大意:给出n个数,要求将n个数分配到两个集合中,集合0中的元素x,要求A-x也再0中,同理1集合. 写了几个版本号,一直WA在第8组数据...最后參考下ans,写了并查集过了 学到:1.注意离散的 ...
- 算法笔记--2-sat
强连通分量的应用,详见<挑战程序设计>P324 例题1:HDU Peaceful Commission 思路:强连通分量分解,看有没有两个同一个国家的代表在一个强连通分量里,如果有,就是N ...
- cf(#div1 B. Dreamoon and Sets)(数论)
B. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input standard ...
- CF 1042 F. Leaf Sets
F. Leaf Sets http://codeforces.com/contest/1042/problem/F 题意: 将所有的叶子节点分配到尽量少的集合,一个可行的集合中两两叶子节点的距离< ...
- cf B. Eight Point Sets
http://codeforces.com/contest/334/problem/B #include <cstdio> #include <cstring> #includ ...
- cf Two Sets (我用二分最大匹配做的)
题意: n个数p1,p2....pn 两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...
- CF下的BackgroudWorker组件优化.
.net compact framwork(2.0/3.5)下没有Backgroundworder组件,在网上找了一个类 经过使用发现了一些问题,主要有一个问题:在一个Dowork事件中对Report ...
- spark MLlib 概念 4: 协同过滤(CF)
1. 定义 协同过滤(Collaborative Filtering)有狭义和广义两种意义: 广义协同过滤:对来源不同的数据,根据他们的共同点做过滤处理. Collaborative filterin ...
随机推荐
- [C#]SQLite执行效率优化结论
一.如要使用SQLite,可以从Visual Studio中的“程序包管理器控制台”输入以下命令完成安装: PM> Install-Package System.Data.SQLite.Core ...
- ARM-GPIO
操作GPIO有三种方法: 调用库函数读取IO的输入电平:uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_pin): 操作寄 ...
- @Pointcut的用法
在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature).让我们先看看execution表示式的格式: ...
- 状态模式-State-订单状态
JAVA设计模式-状态模式-State-订单状态 21. State(状态) 意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 解释: 比如说对订单的提交,第一 ...
- easyUI中numberbox的校验
例:两个numberbox(A,B),其中两个都为必填项,要求在文本框显示红色,来显示其是必填项,其中只有当A填完之后,在能允许B进行填写,否则给出提示框,并清空其中的数据 <!DOCTYPE ...
- Daily Scrumming* 2015.12.20(Day 12)
一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1090 https://github.com/buaaclubs-team/temp-front/com ...
- 解决AJAX session跨域失效
1.想实现的功能是登录时有个验证码,这个验证码后台提供,然后放在session中,前台把用户输入的验证码通过AJAX发给后台,后台把session中的验证码取出来然后比较不同,一样则通过. 问题出现在 ...
- Junit4使用实验报告
一.题目简介 Junit4的使用及求和测试. 二.源码的github链接 https://github.com/bjing123/test-/blob/master/Arithmetic.txt ht ...
- 用软件工程分析开源项目octave的移植
在本科的时候学习了软件工程,报考了信息系统项目管理师的考试,,虽然没有过,但是其实还是学了一些相关项目管理方面的知识,,9大管理,,当年应该能背出来,,, 1 项目整体管理 2 项目范围管理 3 项目 ...
- Windows命令行下如何使用批处理异步打开一个浏览器进程
Browse.bat @echo off if '%1'=='-c' ( start /d "C:\Program Files\Google\Chrome\Application\" ...