个人使用了离散+二分。。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[4005], b[4005], c[4005], d[4005], sum1[16000005], sum2[16000005], bin[16000005], num[16000005], top;
int find(int x,int l,int r)
{
int m;
while(l<=r)
{
m=(l+r)>>1;
if(bin[m]==x)
return m;
if(bin[m]<x)
l=m+1;
else r=m-1;
}
return -1;
}
int main()
{
int n, i, j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
int l1, l2;
l1=l2=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
sum1[l1++]=a[i]+b[j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
sum2[l2++]=c[i]+d[j];
sort(sum2,sum2+l2);
bin[1]=sum2[0], top=1;
num[1]=1;
for(i=1;i<l2;i++)
{
if(sum2[i]!=sum2[i-1])
bin[++top]=sum2[i], num[top]=1;
else num[top]++;
}
int tmp, ans=0;
for(i=0;i<l1;i++)
{
tmp=find(-sum1[i],1,top);
if(tmp!=-1)
ans+=num[tmp];
}
printf("%d\n",ans);
return 0;
}