The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .
Input
The first line of the input file contains the size of the lists n (this value can be as large as 4000). We then have n lines containing four integer values (with absolute value as large as 2
28 ) that belong respectively to A, B, C and D .
Output
For each input file, your program has to write the number quadruplets whose sum is zero.
Sample Input
6 -45 22 42 -16 -41 -27 56 30 -36 53 -37 77 -36 30 -75 -46 26 -38 -10 62 -32 -54 -6 45Sample Output
5Hint
Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).
题意 :有4列数字 你可从第一列中任选一个,从第二列中任选一个,从第三列中任选一个,从第四列中任选一个 要求这四个数和为0 ,求总共有多少种可能
解:一开始我的想法是两个for循环枚举第一列和第二列的所有可能,然后存入map容器中,然后在两个for循环枚举第三列和第四列的所有可能,ans(结果)+=map[-c[i]-d[j]] , 不过一直 tle 可能,map比较耗时
后来 想到可以先把 第一列和第二列的所有可能存到数组中 然后sort一下 ,然后 枚举第三列和第四列的所有可能
ans+=upper_bound()- lower_bound();
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
map<int,int>mapp;
int a[5500];
int b[5500];
int c[5500];
int d[5500];
int e[5500*5500];
int main()
{
int n,tot=0;
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++)
e[tot++]=a[i]+b[j];
sort(e,e+tot);
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int num=c[i]+d[j];
ans+=upper_bound(e,e+tot,-num)-lower_bound(e,e+tot,-num);
}
printf("%d\n",ans);
return 0;
}