第一次hash,sum保存出现次数,第二次hash统计答案,注意负数取模。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<iterator>
#include<map>
#include<iostream>
using namespace std;
#define N 4000+10
int x,y;
int fuck[4][N];
map<int,int>::iterator it;
long long ans;
inline int ReadInt()
{
int flag=0;
char ch = getchar();
int data = 0;
while (ch < '0' || ch > '9')
{
if(ch=='-') flag=1;
ch = getchar();
}
do
{
data = data*10 + ch-'0';
ch = getchar();
}while (ch >= '0' && ch <= '9');
if(flag) data=-data;
return data;
}
#define MAXN 19999997
#define INF 0x7fffffff
int sum[MAXN+10];
int Hash[MAXN+10];
bool HashInsert(int value)
{
int v=(value%MAXN+MAXN)%MAXN;
while(Hash[v]!=INF&&Hash[v]!=value){
v++;
v%=MAXN;
}
if(Hash[v]==INF){
Hash[v]=value;
sum[v]++;
return true;
}
sum[v]++;
return false;
}
void check(int value)
{
int v=(value%MAXN+MAXN)%MAXN;
while(Hash[v]!=INF&&Hash[v]!=value)
{
v++;
v%=MAXN;
}
if(Hash[v]==INF) return;
ans+=sum[v];
}
int main()
{
int n;
while(~scanf("%d",&n))
{
ans=0;
fill_n(Hash,MAXN,INF);
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++)
{
for(int j=0;j<4;j++)
{
fuck[j][i]=ReadInt();
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
HashInsert(fuck[0][i]+fuck[1][j]);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
check(-fuck[2][i]-fuck[3][j]);
}
}
cout<<ans<<endl;
}
return 0;
}
/*
2
1 2 -2 3
-3 -2 2 -1
*/