题意
给你一个集合s
让你把这个集合划分为两个集合
在集合A中若x存在则a-x也存在
在集合B中若x存在则b-x也存在
数据范围
|s|<1e5
a<1e9
b<1e9
注意
集合中不包含相同的数
题解
使用并查集维护,
容易证明若x和a-x存在,则他们必定在同一个集合中
x和b-x同理
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<bits/stdc++.h> using namespace std;
map<int,int>fa; int find(int x){ if(fa.find(x)==fa.end()) fa[x]=x; return x==fa[x]?x:fa[x]=find(fa[x]); } void join(int x,int y){ int f1=find(x); int f2=find(y); if(f1>f2) swap(f1,f2); fa[f1]=f2; }
map<int,int>mp; const int maxn=1e5+5; int p[maxn];
int main(){ int n,a,b; scanf("%d%d%d",&n,&a,&b); for(int i=1;i<=n;i++) { scanf("%d",p+i); mp[p[i]]++; } const int A=1e9+123; const int B=1e9+124; for(int i=1;i<=n;i++) { if(mp.find(a-p[i])!=mp.end()) join(p[i],a-p[i]); else join(p[i],B); if(mp.find(b-p[i])!=mp.end()) join(p[i],b-p[i]); else join(p[i],A); } if(find(A)==find(B)){ printf("NO\n"); } else{ printf("YES\n"); for(int i=1;i<=n;i++) { if(find(p[i])<=1e9) join(p[i],A); if(find(p[i])==A) printf("0 "); else printf("1 "); } } }
|
最后更新时间:
这里可以写作者留言,标签和 hexo 中所有变量及辅助函数等均可调用,示例:
<%- page.permalink.replace(/index\.html$/, '') %>