首先知道p[i]≥1,所以不存在p[i]大于等于max(a,b)
用map<ll,ll>mp记录下每个p[i]出现的下标,每次找到b-p[i]或a-p[i]都进行一次连接
因为考虑优先放入到b中,所以在YES的前提下,if判断是否放在b的条件放在前面。
需要注意的输出格式问题,就是最后没有多余的空格,当时我傻了挺久的才发现这个。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
ll pre[100005],p[100005];
void init(ll n)
{
for(ll i=0;i<=n+1;i++)
pre[i]=i;
}
ll Find(ll x)
{
return pre[x]==x?x:pre[x]=Find(pre[x]);
}
void mix(ll a,ll b)
{
ll fa=Find(a),fb=Find(b);
if(fa!=fb){
pre[fa]=fb;
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
ll n,a,b,mx=0;cin>>n>>a>>b;
init(n);
map<ll,ll>mp;
for(ll i=1;i<=n;i++)
{
cin>>p[i];
mp[p[i]]=i;
mx=max(mx,p[i]);
}
if(mx>=max(a,b)){
cout<<"NO";return 0;
}
for(ll i=1;i<=n;i++)
{
if(mp[b-p[i]]){
mix(i,mp[b-p[i]]);
}
else mix(i,0);
if(mp[a-p[i]]){
mix(i,mp[a-p[i]]);
}
else mix(i,n+1);
}
ll numa = Find(0);
ll numb = Find(n+1);
if(numa==numb){
cout<<"NO";
}
else {
cout<<"YES"<<endl;
for(ll i=1;i<=n;i++)
{
if(numa==Find(i)){
cout<<0;
}
else cout<<1;
if(i!=n)
cout<<" ";
}
}
}
京公网安备 11010502036488号