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