1173: PIPI的集合

题目描述

PIPI有四个长度为n的整数集合 A,B,C,D 。现在从4个集合中分别取出a,b,c,d四个元素,使得a+b+c+d=0。PIPI想问: 总共有多少选法?

输入

输入第一行包含一个整数T代表测试用例数目。
对于每组测试用例,输入第一行是一个正整数 n ,代表集合大小(n<=4000)。
以下包含一个 n*4的矩阵,代表四个集合。

输出

对于每一个测试用例,输出一个数字代表选法数目,两组测试用例之间有一个空格。

样例输入

2
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
6
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1

样例输出

5

1296

#include<bits/stdc++.h>
using namespace std;
const int N=4005;
int a[4][N];
unordered_map<int,int> mp;
int main()
{
    int tcase,n;
    scanf("%d",&tcase);
    while(tcase--)
    {
        mp.clear();
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            for(int j=0;j<4;j++)
                scanf("%d",&a[j][i]);  ///输入数组
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                mp[a[0][i]+a[1][j]]++; ///将(a+b)的值与个数进行映射
        long long ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                int t=-(a[2][i]+a[3][j]); ///-(c+d)
                ans+=mp[t];               ///如果-(c+d)=(a+b) 累加a+b的个数
            }
        }
        printf("%lld\n",ans);
        if(tcase) printf("\n"); ///空行
    }
}
发布了28 篇原创文章 · 获赞 7 · 访问量 1165

猜你喜欢

转载自blog.csdn.net/weixin_44433678/article/details/104045898