Code:
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_N=100005;
int n,a,b;
int c[MAX_N];
int d[MAX_N][2];
bool book[MAX_N][2];
int Find(int id);
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
bool p=true;
cin>>n>>a>>b;
for(int i=0,x;i<n;++i)
{
cin>>x;
c[i]=x;
}
sort(c,c+n);
for(int i=0;i<n;++i)
{
d[i][0]=-1; d[i][1]=-1;
int k1=lower_bound(c,c+n,a-c[i])-c;
int k2=lower_bound(c,c+n,b-c[i])-c;
if(k1!=n&&c[k1]==a-c[i]) d[i][0]=k1;
if(k2!=n&&c[k2]==b-c[i]) d[i][1]=k2;
if(d[i][0]==-1&&d[i][1]==-1){
p=false; break;
}
}
for(int i=0;i<n&&p==true;++i)
if(book[i][0]==false&&book[i][1]==false){
int t=Find(i);
if(t>0&&(t%2==1)) p=false;
}
if(p==true) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
int Find(int id)
{
int ans=1;
if(book[id][0]==false&&d[id][0]!=-1){
int t=d[id][0];
if(t==id) ans=-100000000;
book[id][0]=book[t][0]=true;
ans+=Find(t);
}
if(book[id][1]==false&&d[id][1]!=-1){
int t=d[id][1];
if(t==id) ans=-100000000;
book[id][1]=book[t][1]=true;
ans+=Find(t);
}
return ans;
}
//该思路有错误
思路:对于整数 x, 在集合A 和 集合 B 中的数分别为 A-x,B-x, 对于 x有三种情况:
一: A-x,B-x都不存在,那么肯定为 NO;
二:A-x,B-x存在一种,这样x可以分配到集合A或B中;
三:A-x,B-x都存在,这样的话,x只能与其中一个组合,那么对于 A-x,B-x,就要判断他们的另一组合数是否存在,若存在则可以继续组合,若 都不存在的话就为 NO.
Code :
#include<iostream>
#include<set>
using namespace std;
int n,a,b;
set<int> iset;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>a>>b;
for(int i=0,x;i<n;++i)
{
cin>>x;
iset.insert(x);
}
bool boo=true;
for(auto x:iset)
if(iset.find(a-x)!=iset.end()&&iset.find(b-x)!=iset.end()){
if(iset.find(b-a+x)==iset.end()&&iset.find(a-b+x)==iset.end()){
boo=false; break;
}
}else if(iset.find(a-x)==iset.end()&&iset.find(b-x)==iset.end()){
boo=false; break;
}
if(boo==true) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}