先把任意两个数的和打表出来,然后枚举两个数,然后再在那些和里面查找 0-n1-n2。查找到后,看一下和n1或者n2是否重复,如果不重复,才符合条件。还可能有好多两个数字的和是一样的,所以不要查找到比过就完了,还要往后看看数字是否一样。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 500100;
struct ss
{
int i,j;
LL sum;
bool operator<(const ss& b)
{
return sum < b.sum;
}
};
ss sums[MAXN];
int slen = 0;
LL num[1010];
int n;
int BS(int number)
{
int l = 0;
int r = slen-1;
int mid = (l+r) >> 1;
while(l <= r)
{
if(sums[mid].sum < number)
l = mid+1;
else if(sums[mid].sum > number)
r = mid-1;
else if(sums[mid].sum == number)
return mid;
mid = (l+r) >> 1;
}
return -1;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = 0; i < n; ++i)
{
cin >> num[i];
for(int j = 0; j < i; ++j)
{
sums[slen].i = i;
sums[slen].j = j;
sums[slen++].sum = num[i]+num[j];
}
}
sort(sums,sums+slen);
int index;
LL temp;
set<int> sets;
for(int i = 0; i < n; ++i)
{
for(int j = i+1; j < n; ++j)
{
temp = 0LL-num[i]-num[j];
index = BS(temp);
if(index != -1)
{
while(sums[index].sum == temp)
{
sets.clear();
sets.insert(i);
sets.insert(j);
sets.insert(sums[index].i);
sets.insert(sums[index].j);
if(sets.size() == 4)
{
cout << "Yes" <<endl;
return 0;
}
index++;
}
}
}
}
cout << "No" << endl;
return 0;
}