小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示例
样例输出1YES
#include <iostream> #include <algorithm> using namespace std; const int MAXN = 1e5 + 5; int input[MAXN]; int n, a, b; bool find(int k) { int left = 0; int right = n-1; while (left <= right) { int mid = left + (right-left)/2; if (input[mid] == k) { return true; } else if (input[mid] < k) { left = mid + 1; } else { right = mid - 1; } } return false; } int main() { cin >> n >> a >> b; for (int i = 0; i < n; i++) { cin >> input[i]; } sort(input, &input[n]); for (int i = 0; i < n; i++) { int c = find(a-input[i]); int d = find(b-input[i]); if (!c && !d) { cout << "NO" << endl; return 0; } else if (c && d) { bool e = find(a-(b-input[i])); bool f = find(b-(a-input[i])); if (!e && !f) { cout << "NO" << endl; return 0; } } } cout << "YES" << endl; return 0; }