思路:因为数据规模太大,直接枚举肯定超时,先把C+D的所有值存在一个hash表里,再枚举A+B的值。(PS:用的C++11的unordered_map,时限9秒,跑了接近五秒才跑完)
#include<cstdio>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int maxn=4005;
unordered_map<int,int>cnt;
int a[maxn],b[maxn],c[maxn],d[maxn];
int n;
void solve(){
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(cnt.count(-a[i]-b[j])){
ans+=cnt[-a[i]-b[j]];
}
}
}
printf("%d\n",ans);
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T,kase=0;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
}
cnt.clear();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!cnt.count(c[i]+d[j])){
cnt[c[i]+d[j]]=0;
}
cnt[c[i]+d[j]]++;
}
}
if(kase++){
printf("\n");
}
solve();
}
return 0;
}