双向搜索 Hash优化
和为0的4个值
给定4个n元素集合A,B,C,D,要求分别从中选取一个元素a, b, c, d,使得a + b + c + d = 0
问:有多少种选法
输入
第1行:1个整数表示测试数据的组数,然后一个空行
第3行:1个整数n,表示每个集合有多少个元素
接下来n行,每行4个整数,绝对值不超过2^28,分别表示A,B,C,D四个集合中的一个元素
输出
对每组测试数据输出一行,1个整数,表示答案
样例输入
1
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45
样例输出
5
Code
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
#define MAX_N 4000
map<int,int>Q;//map[i]存放和为i的(a,b)的个数
int A[MAX_N],B[MAX_N],C[MAX_N],D[MAX_N];//四个集合
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,ans=0;
Q.clear();
memset(A,0,sizeof A);
memset(B,0,sizeof B);
memset(C,0,sizeof C);
memset(D,0,sizeof D);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
Q[A[i]+B[j]]++;//存放a+b
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans+=Q[-(C[i]+D[j])];//统计(互为相反数则和为0)
printf("%d\n",ans);
}
}
对于一些普通数据,这个代码可以过,但对与大型数据,这个代码会超时,所以## 标题 ##用Hash来解决