和为0的4个值

双向搜索 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来解决

猜你喜欢

转载自blog.csdn.net/qq_38956769/article/details/79624238