题目链接
题意
给你一个包含 n 个整数的列表。您可以执行以下操作:从列表中选择一个元素 x,从列表中删除 x,然后从所有剩余元素中减去 x 的值。求是否能使列表中唯一剩余的元素等于 k。
思路
设数组原来为(这里按照删除顺序排序,最先删除的排最后): a 1 a 2 . . . a n a_1\;a_2\;...\;a_n a1a2...an
减去一个数后 : ( a 1 − a n ) ( a 2 − a n ) . . . ( a n − 1 − a n ) (a_1 - a_n)\;(a_2 - a_n)\;...\;(a_{n-1} - a_n) (a1−an)(a2−an)...(an−1−an)
再减去一个数后 : ( a 1 − a n − 1 ) ( a 2 − a n − 1 ) . . . ( a n − 2 − a n − 1 ) (a_1 - a_{n-1})\;(a_2 - a_{n-1})\;...\;(a_{n-2} - a_{n-1}) (a1−an−1)(a2−an−1)...(an−2−an−1)
(省略 n 次左右的操作)
最后得到: ( a 1 − a 2 ) (a_1 - a_2) (a1−a2)
发现能否取到 k 只需看是否存在 2 个数使他们之间的差值为 k 即可
代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
typedef pair<int, int> pii;
#define ioClose() ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define debug printf("\n====================\n");
const int N = 2e5 + 5;
const int mod = 998244353;
int a[N];
map<int, bool> mp;
int main() {
int T = 1;
cin >> T;
while (T--) {
mp.clear();
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i], mp[a[i]] = true;
bool flag = false;
for (int i = 1; i <= n; i++) {
if (mp[a[i] - k] || mp[k + a[i]]) {
flag = true;
break;
}
}
puts(flag ? "YES" : "NO");
}
return 0;
}