4 Values whose Sum is 0
Time Limit: 15000MS | Memory Limit: 228000K | |
Total Submissions: 22637 | Accepted: 6848 | |
Case Time Limit: 5000MS |
Description
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 45
Sample Output
5
Hint
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).
题目分析:直接枚举的复杂度是O(n^4) 明显TL ,用二分进行简化的话是O(n^2) 。首先枚举前两列的和,然后再从后两列中查找和为前两列和的结果就可以了
STL大法好啊:upper_bound会在数组中找到这个数最大能插入的位置;lower_bound会在数组中找到这个数最小能插入的位置;两者相减正好是排好序之后的数组中某个元素的个数
代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxx = 4005;
int A[maxx],B[maxx],C[maxx],D[maxx];
int E[maxx * maxx],F[maxx * maxx];
int t;
int main(){
scanf("%d",&t);
for(int i=0;i<t;i++)
{
scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);
}
int k1=0,k2=0;
for(int i=0;i<t;i++)//合并前两个数组和后两个数组
{
for(int j=0;j<t;j++)
{
E[k1++] = A[i] + B[j];
F[k2++] = C[i] + D[j];
}
}
sort(E,E+k1);//给第一个合并后的数组进行排序
int sum = 0;
for(int i=0;i<k2;i++)
{
int aa = upper_bound(E,E+k1,-1*F[i])-lower_bound(E,E+k1,-1*F[i]);//二分查找,因为相加要等于零,所以直接查找当前数的负数看存在多少个。
sum+=aa;
}
printf("%d\n",sum);
return 0;
}