hash
#include<cstdio>
#include<iostream>
#include<map>
#include<vector>
using namespace std;
const int maxn=4005;
int a[maxn],b[maxn],c[maxn],d[maxn];
struct Hash_map
{
static const int mask=0x7fffff;
int p[8388608],q[8388608];
void clear() //初始化为0
{
for(int i=0; i<=mask; ++i)
q[i]=0;
}
int& operator [](int k) //重载“[]”
{
int i;
for(i=k&mask; q[i]&&p[i]!=k; i=(i+1)&mask);
p[i]=k;
return q[i];
}
}hash;
int main()
{
int t,i,j,n;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(i=0;i<n;i++) {
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
}
hash.clear();
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
hash[a[i]+b[j]]++;
}
}
int sum=0;
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
sum+=hash[-c[i]-d[j]];
}
}
printf("%d\n",sum);
if(t) printf("\n");
}
return 0;
}
二分_stl
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=4005;
int a[maxn],b[maxn],c[maxn],d[maxn],s1[maxn*maxn],s2[maxn*maxn];
int main()
{
int t,n,i,j;
scanf("%d",&t);
for(int z=1;z<=t;z++) {
scanf("%d",&n);
for(i=0;i<n;i++) {
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
}
int k1=0,k2=0;
for(i=0;i<n;i++) {
for(j=0;j<n;j++){
s1[k1++]=a[i]+b[j];
s2[k2++]=c[i]+d[j];
}
}
sort(s2,s2+k2);
int sum=0;
for(i=0;i<k1;i++) {
sum+=upper_bound(s2,s2+k2,-s1[i])-lower_bound(s2,s2+k2,-s1[i]);
}
printf("%d\n",sum);
if(z!=t) printf("\n");
}
return 0;
}