2018-1-10
这道题目如果直接枚举的话,需要我们O(n^4)的复杂度,但是我们如果用二分搜索的话,可以加快我们的求解。
由题意可以得知,我们要求出满足a+b+c+d=0的所有情况,那么可以转换为a+b=-c-d,假设我们可以求出的c+d的大小,那么我们可以求出a+b的大小组成的数组,排序后找出所有满足值为-c-d的元素的个数,进而得到结果。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 4000;
int a[N+1],b[N+1],c[N+1],d[N+1],s[N*N+1];
int n,sum;
int main(){
while (cin>>n){
sum=0;
for (int i=0;i<n;i++){
scanf ("%d%d%d%d",a+i,b+i,c+i,d+i);
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
s[i*n+j]=a[i]+b[j];
}
}
sort(s,s+n*n);
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
int k=-(c[i]+d[j]);
sum+=upper_bound(s,s+n*n,k)-lower_bound(s,s+n*n,k);
}
}
cout<<sum<<endl;
}
return 0;
}