首先知道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<<" ";
        }
    }

}