解题思路:大致就是如果直接四组枚举各种情况,那情况有O(N^4)。超时!如果使用折半枚举,则先枚举两组的情况,再用另外两组进行二分查找。复杂度为O(N^2logN^2).符合要求
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s[4][4006];
int r[16000009];
int main()
{
//freopen("t.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<4;j++)
scanf("%d",&s[j][i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
r[i*n+j]=s[0][i]+s[1][j];
}
}
sort(r,r+n*n);
long long res=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int tp=-(s[2][i]+s[3][j]);
res+=upper_bound(r,r+n*n,tp)-lower_bound(r,r+n*n,tp);
}
}
printf("%lld\n",res);
}
return 0;
}