题目大意:给出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. Vim 自动文件头注释与模板定义

    Vim 自动文件头注释与模板定义 在vim的配置文件.vimrc添加一些配置可以实现创建新文件时自动添加文件头注释,输入特定命令可以生成模板. 使用方法 插入模式输入模式输入seqlogic[Ente ...

  2. ado.net 数据库连接的两方式种

    DataAdapter: string connectionString = "data source=127.0.0.1;Database=dong;user id=sa;password ...

  3. iOS_SN_百度地图基本使用(1)

    上次用了一次百度地图,一直没有记笔记,今天记一笔. 以前没有用过百度地图的时候,听做这方面的朋友说百度地图有不少的坑,但是我做的时候没有遇到太大的坑,主要是要注意官方文档的注意事项,还有配置环境开发中 ...

  4. angularjs使用ng-messages的注册表单实例

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...

  5. properties文件的读取

    Demo //声明资源器类 Properties pro=new Properties(); //获取路径 URL url= PropertiesTest.class.getClassLoader() ...

  6. uva12486 Space Elevator(数位dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目链接:https://uva.onlinejudge.org/index.ph ...

  7. mysql 主从搭建

    主要搭建步骤如下: 1.打开binlog,设置server_id     打开主库的--log-bin,并设置server_id 2.主库授权                --最好也在从库对主库授权 ...

  8. Linux修改时间时区并在Tomcat中生效

    Linux查看当前时间时区linux:~ # datelinux:~ # date –Rlinux:~ # zdump -v /usr/share/zoneinfo/Asia/Beijing ---- ...

  9. jquery easyui根据需求二次开发记录

    1.tree需要显示多个图标 实际需求:设备树上节点需搁三个图片,分别标识运行状态.告警状态.设备类型 解决方法:给tree的iconCls传入一个数组,分别是各状态下的class(css),然后要改 ...

  10. $rootScope

    参考地址 https://docs.angularjs.org/api/ng/type/$rootScope.Scope angular 的scope一般上都是有继承关系的,也就是说可以通过原型访问到 ...