集合问题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给你a,b和n个数p[i],问你如何分配这n个数给A,B集合,并且满足:
若x在集合A中,则a-x必须也在集合A中。
若x在集合B中,则b-x必须也在集合B中。
输入描述:
第一行 三个数 n a b 1<=n<=1e5 1<=a,b<=1e9 第二行 n个数 p1 p2 p3...pn 1<=pi<=1e9
输出描述:
如果可以恰好分开就输出第一行 YES 然后第二行输出 n个数 分别代表pi 是哪个集合的 0 代表是A集合 1代表是B 集合 不行就输出NO 放在哪个集合都可以的时候优先放B
示例1
输入
4 5 9 2 3 4 5
输出
YES 0 0 1 1
示例2
输入
3 3 4 1 2 4
输出
NO
const int MAX=100010;
int vis[MAX];
int arr[MAX];
int n;
int a,b;
int main(){
cin>>n>>a>>b;
for(int i=0;i<n;i++){
cin>>arr[i];
}
sort(arr,arr+n);
int flag=0;
mms(vis,0);
for(int i=0;i<n;i++){
if(!vis[i]){
int a1=lower_bound(arr,arr+n,a-arr[i])-arr;
int b1=lower_bound(arr,arr+n,b-arr[i])-arr;
if(!vis[b1]&&arr[i]+arr[b1]==b){
vis[i]=1;
vis[b1]=1;
}
else if(!vis[a1]&&arr[i]+arr[a1]==a){
vis[i]=2;
vis[a1]=2;
}
}
}
for(int i=0;i<n;i++){
if(vis[i]==0){
flag=1;
break;
}
}
if(flag) cout<<"NO"<<endl;
else {
cout<<"YES"<<endl;
for(int i=0;i<n;i++){
cout<<vis[i]%2<<" ";
}
}
}