小X有n个互不相同的整数: p1,p2,...,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。
· 如果x属于A,那么a-x也肯定属于A。
· 如果x属于B,那么b-x也肯定属于B。
判断一下是否存在一种方案来分配这些数字到集合A,B中。
注意:如果一个集合为空也是可以的。
Input
单组测试数据。 第一行有三个整数n,a,b (1≤n≤10^5; 1≤a,b≤10^9)。 第二行有n个不一样的整数 p1,p2,...,pn (1≤pi≤10^9).
Output
如果可行,那么输出YES,否则输出NO。
Input示例
样例输入1 4 5 9 2 3 4 5
Output示例
样例输出1 YES
System Message
(题目提供者)
Visual C++的运行时限为:1000 ms ,空间限制为:131072 KB
示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
将原序列排序,进行二分查找即可
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long
#define inf 1000000000
#define mod 1000000007
#define maxn 100008
#define lowbit(x) (x&-x)
#define eps 1e-9
ll val[maxn],n;
int find(int x)
{
int l=1,r=n;
while(l<=r)
{
int mid=(l+r)/2;
if(val[mid]<x)
l=mid+1;
else if(val[mid]>x)
r=mid-1;
else
return 1;
}
return 0;
}
int main(void)
{
ll a,b,i,flag=0;
scanf("%lld%lld%lld",&n,&a,&b);
for(i=1;i<=n;i++)
scanf("%lld",&val[i]);
sort(val+1,val+n+1);
for(i=1;i<=n;i++)
{
int x=find(a-val[i]);
int y=find(b-val[i]);
if(!x && !y)
{
printf("NO\n");
return 0;
}
if(x && y)
{
x=find(b-(a-val[i]));
y=find(a-(b-val[i]));
if(!x && !y)
{
printf("NO\n");
return 0;
}
}
}
printf("YES\n");
return 0;
}