当时自己想的二分是直接搜索中间数!然后想在从这个点遍历前后,贼麻烦
发现二分也可以两边同时进行。。长知识了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
typedef struct node{
int x,y;
long long sum;
}node;
bool cmp(node n1,node n2){
return n1.sum<n2.sum;
}
int main(){
int n;
static node no[1000000+10];
long long a[2000];
cin>>n;
for(int i=0;i<n;i++) scanf("%lld",&a[i]);
int cnt=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
no[cnt].x=i;
no[cnt].y=j;
no[cnt++].sum=a[i]+a[j];
}
}
sort(no,no+cnt,cmp);
int zuo=0,you=cnt-1;
int flag=0;
while(zuo<you){
if(no[zuo].sum+no[you].sum==0){
if(no[zuo].x!=no[you].x&&no[zuo].x!=no[you].y&&no[zuo].y!=no[you].x&&no[zuo].y!=no[you].y)
{
flag=1;
break;
}
if(no[zuo].sum==no[zuo+1].sum) zuo++;
else if(no[you].sum==no[you-1].sum) you--;
else zuo++,you--;
}
else if(no[zuo].sum+no[you].sum<0) zuo++;
else you--;
}
if(flag) cout<<"Yes";
else cout<<"No";
return 0;
}