POJ 2785 HASH
题目链接:http://poj.org/problem?id=2785
题意:给定n行数字,每行4个数分别是a,b,c,d,现在要求能有多少个(a,b,c,d)组合并且和为0
思路:n^2统计所有(a+b),然后n^2统计(-1*(c+d)),再从(a+b)中找即可。注意map会超时。所以可以用Hash表或者排序+二分
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #include<vector> #include<cmath> #include<time.h> #include<map> using namespace std; typedef long long int LL; const int MAXN=4000+5; struct Node{ int a,b,c,d; }Num[MAXN]; int Hash[MAXN*MAXN]; int main(){ int n; while(~scanf("%d",&n)){ int cnt=0; for(int i=1;i<=n;i++){ scanf("%d%d%d%d",&Num[i].a,&Num[i].b,&Num[i].c,&Num[i].d); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int Sum=Num[i].a+Num[j].b; Hash[cnt++]=Sum; } } sort(Hash,Hash+cnt); int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int Sum=(-1)*(Num[i].c+Num[j].d); for(int k=lower_bound(Hash,Hash+cnt,Sum)-Hash;k<cnt;k++){ if(Hash[k]!=Sum){ break; } else{ ans++; } } } } printf("%d\n",ans); } return 0; }