给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。
第2 - N + 1行:A i (-10^9 <= A i
5 -1 1 -5 2 4
Yes
/*
补充测试样例:
输入
4
3 -3 0 1
输出 No
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 1005;
typedef long long ll;
struct node{
int x,y;
ll val;
}arr[N*N];
ll num[N];
int cmp(node a,node b){
return a.val<b.val;
}
int cheak(node a,node b){
if(a.x!=b.x&&a.y!=b.y&&a.y!=b.x&&a.x!=b.y) return 1;
return 0;
}
int Find(int n,int val,node tem){
int l=0,r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(arr[mid].val==val){
if(cheak(tem,arr[mid])) return 1;
else l=mid+1;
}
else if(val<arr[mid].val) r=mid-1;
else l=mid+1;
}
return 0;
}
int main(){
int n;
scanf("%d",&n);
int m=0;
for(int i=1;i<=n;i++){
scanf("%lld",&num[i]);
for(int j=1;j<i;j++){
arr[m].x=i;
arr[m].y=j;
arr[m++].val=num[i]+num[j];
}
}
sort(arr,arr+m,cmp);
int flag=0;
for(int i=1;i<m;i++){
if(Find(m,-arr[i].val,arr[i])){
flag=1;
break;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}