很有意思的一道題,四個數組可以先加兩個,另外兩個再來找相加等於前面相加的,把n4方的複雜度降到了n2方logn
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=4050;
int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
int ab[MAXN*MAXN];
int sum;
int main()
{
int n;
cin>>n;
int ans=0;
for(int i=0;i<n;i++)
cin>>a[i]>>b[i]>>c[i]>>d[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ab[n*i+j]=a[i]+b[j];
}
}
sort(ab,ab+n*n);
for(int i=0;i<n*n;i++)
cout<<ab[i]<<" ";
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
sum=-(c[i]+d[j]);
ans+=upper_bound(ab,ab+n*n,sum)-lower_bound(ab,ab+n*n,sum);
//在ab中要是沒有sum這個數的話,lower和upper都找不到是0,有重複的可以直接加起不需要下次再看
}
}
cout<<ans<<endl;
return 0;
}