Codeforces1656B题 Subtract Operation
Codeforces1656B题 Subtract Operation
题目
You are given a list of n integers. You can perform the following operation: you choose an element x from the list, erase x from the list, and subtract the value of x from all the remaining elements. Thus, in one operation, the length of the list is decreased by exactly 1.
Given an integer k (k>0), find if there is some sequence of n−1 operations such that, after applying the operations, the only remaining element of the list is equal to k.
Input
The input consists of multiple test cases. The first line contains a single integer t (1≤t≤10^4) — the number of test cases. Description of the test cases follows.
The first line of each test case contains two integers nn and kk (2≤n≤2⋅10^5, 1≤k≤10^9), the number of integers in the list, and the target value, respectively.
The second line of each test case contains the n integers of the list a1,a2,…,an(−10^9 ≤ai≤10^9).
It is guaranteed that the sum of n over all test cases is not greater that 2⋅10^5.
Output
For each test case, print YES if you can achieve k with a sequence of n−1 operations. Otherwise, print NO.
You may print each letter in any case (for example, "YES", "Yes", "yes", "yEs" will all be recognized as a positive answer).
Example
input
Copy
4
4 5
4 2 2 7
5 4
1 9 1 3 4
2 17
17 0
2 17
18 18
output
Copy
YES
NO
YES
NO
Note
In the first example we have the list {4,2,2,7}, and we have the target k=5. One way to achieve it is the following: first we choose the third element, obtaining the list {2,0,5}. Next we choose the first element, obtaining the list {−2,3}. Finally, we choose the first element, obtaining the list {5}.
思路
如果数组中恰好有两个数的差等于k,那么这两个数同时减去任意数,他们之间的差不会变,恒为k
代码
#include<iostream>
#include<map>
using namespace std;
int n,t,k,a[200005];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
bool flag=false;
map<int,bool> mp;
for(int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]]=true;
}
for(int i=1;i<=n;i++)
if(mp[a[i]+k])
{
flag=true;
break;
}
if(flag) puts("YES");
else puts("NO");
}
return 0;
}