4 Values whose Sum is 0 POJ

来源:互联网 发布:做淘宝客服工资怎么样 编辑:程序博客网 时间:2024/05/22 02:13
4 Values whose Sum is 0
Time Limit: 15000MS Memory Limit: 228000KTotal Submissions: 22637 Accepted: 6848Case 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 228 ) 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 -4626 -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;}



原创粉丝点击