题目大意:给出n个数,要求将n个数分配到两个集合中,集合0中的元素x,要求A-x也再0中,同理1集合。

写了几个版本号,一直WA在第8组数据...最后參考下ans,写了并查集过了

学到:1、注意离散的逻辑思维,官方答案的 从条件推逆否命题

2、并查集做法:fa[find(i)]=mp[a-p[i]]
? find(a-p[i]) :
find(n+2);

3、离散化然后hash的方法,用map时间还是承受得住的,写起来也简单

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const double pi = acos(-1.0);
const int INF = 100000000; const int MAXN = 1e5+100; int fa[MAXN],p[MAXN],vis[MAXN];
int n,a,b;
map <int , int> mp; int Fi(int x)
{
if(x!=fa[x])fa[x]=Fi(fa[x]);
return fa[x];
} void un(int x, int y)
{
x=Fi(x);
y=Fi(y);
fa[x]=y;
}
int flag;
void init()
{
for(int i=0;i<=n+3;i++)
fa[i]=i;
mp.clear();
CL(vis,0xff);
flag=1;
} /*void solve()
{
for(int i=1;i<=n;i++)
{
if(mp[a-p[i]])
{
if(Fi(fa[mp[a-p[i]]])==Fi(n+2) || mp[b-p[i]])
{
flag=0;
return;
}
else
{
un(mp[a-p[i]],n+1);
}
}
else
{
if(mp[b-p[i]])
{
if(Fi(fa[mp[b-p[i]]]) == Fi(n+1) || mp[a-p[i]])
{
flag=0;
return;
}
else
{
un(mp[b-p[i]],n+2);
}
}
else
{
flag=0;
return;
}
}
}
}*/
void solve()
{
for(int i=1;i<=n;i++)
{
fa[Fi(i)] = mp[a-p[i]] ? Fi(mp[a-p[i]]) : Fi(n+2);
fa[Fi(i)] = mp[b-p[i]] ? Fi(mp[b-p[i]]) : Fi(n+1);
}
} int main()
{
//IN("D.txt");
while(~scanf("%d%d%d",&n,&a,&b))
{
init();
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
mp[p[i]]=i;
}
solve();
if(flag && Fi(n+1)!=Fi(n+2))
{
printf("YES\n");
int ans[MAXN],cnt=1;
for(int i=1;i<=n;i++)
{
if(Fi(i) == Fi(n+1))
ans[i]=0;
else
ans[i]=1;
}
printf("%d",ans[1]);
for(int i=2;i<=n;i++)
printf(" %d",ans[i]);
putchar('\n');
}
else
puts("NO"); }
return 0;
}

Codeforces 468B Two Sets 并查集的更多相关文章

  1. codeforces 468B two set(并查集)

    链接 B. Two Sets 题意 给两个集合A B,两个数a b,n个数x,分配n个数到两个集合,要求x , a-x在同一个集合,x , b-x在同一个集合,属于A集合的数输出0,B的输出1,无解输 ...

  2. Codeforces 469 D. Two Sets (并查集)

    题目链接:Two Sets 题意: 有n个数,要分成A.B两组,要求如果x∈A则a-x∈A,如果x∈B则b-x∈B,问是否存在一种符合要求的分法. 题解: 并查集,先增加两个点表示A和B集合的根,对于 ...

  3. Codeforces Gym 100463E Spies 并查集

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. LIB文件和DLL文件的作用

    (1)lib是编译时需要的,dll是运行时需要的.如果要完成源代码的编译,有lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有.(2)一般的动态库程序有lib ...

  2. C#逻辑运算符详解

    代码如下: namespace ConsoleApplication1 { class @class { static void Main_1(string[] args) //输出用户输入的内容 { ...

  3. C#。4 数组

    一.跳出循环的俩个关键字 1.break与continue.        这两个关键字一般放在循环的花括号里面使用.break——结束整个循环.continue——结束本次循环,进入下次循环. br ...

  4. Sherpa | Complete Navigation System 介绍与教材

    这里的夏尔巴人在iPad上使用的一种新的视频. 正如其名称所暗示的,夏尔巴人是所有您的导航需求的整体解决方案. 夏尔巴人带来了每个接口的三个主要的导航元素结合在一起 - 导航栏,侧边栏和页脚粘. 每一 ...

  5. 【socket.io研究】0.前提准备

    WebSocket出现之前,web实时推送,一般采用轮询和Comet技术(可细分为长轮询机制和流技术两种),需要大量http请求,服务器受不了.HTML5定义了WebSocket协议,基于TCP协议, ...

  6. 难搞的Android开发环境(sdk 代理)

    概述 搞了近一周的环境搭建,在csdn上提个问,有位网友说弄一下代理,搜一下,果真有人写博客:Android SDK代理服务器解决国内不能更新下载问题 其实我下了很多个集成好的 adt-bundle- ...

  7. [c#]asp.net开发微信公众平台(3)微信消息封装及反射赋值

    上一篇已经搭建好整体框架,实现了入口的验证,   验证通过后就交给LookMsgType方法处理,LookMsgType方法主要是对微信发来的不同的消息进行分解,不同的类型交给业务逻辑层不同的方法处理 ...

  8. hadoop mapreduce 端参数优化

    在MapReduce执行过程中,特别是Shuffle阶段,尽量使用内存缓冲区存储数据,减少磁盘溢写次数:同时在作业执行过程中增加并行度,都能够显著提高系统性能,这也是配置优化的一个重要依据. 下面分别 ...

  9. C++ Primer 5th 第5章 语句

    和大多数语言一样,C++提供了条件执行语句.重复执行相同代码的循环语句和由于中断当前控制流的跳转语句,表达式语句和声明语句等. 语句有简单语句和复合语句之分.简单语句但多数以分号结束,最简单的语句就是 ...

  10. .net framework3.0 以上版本开发的软件乱码问题

    首先介绍一下:WPF是微软新一代图形系统,运行在.NET Framework 3.0及以上版本下,为用户界面.2D/3D 图形.文档和媒体提供了统一的描述和操作方法.基于DirectX 9/10技术的 ...