poj 2785 4 Values whose Sum is 0

来源:互联网 发布:c图形界面编程 编辑:程序博客网 时间:2024/06/01 10:21

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).



这道题我是使用了二分查找的方式;

开始抽了,忘记了多解情况,用了STL;



#include<iostream>#include<cstdlib>#include<string>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<stack>#include<queue>#include<iomanip>using namespace std;int sum1[16100000],sum2[16100000];int binary(int left,int right,int k,int t){    int i;    while(left<=right)    {        int mid=(left+right)/2;        int num=0;        if(sum2[mid]==k)        {            num=1;            for(i=mid-1;i>=0&&sum2[i]==k;--i) ++num;            for(i=mid+1;i<t&&sum2[i]==k;++i) ++num;            return num;        }        else if(sum2[mid]>k)            right=mid-1;        else left=mid+1;    }    return 0;}int main(){    int n,s[5000][4];    scanf("%d",&n);    for(int i=0;i<n;++i)        for(int j=0;j<=3;++j)    {        scanf(" %d",&s[i][j]);    }    int t=0;    for(int i=0;i<n;++i)        for(int j=0;j<n;++j)    {        sum1[t]=s[i][0]+s[j][1];        sum2[t++]=-(s[i][2]+s[j][3]);    }    sort(sum2,sum2+t);    int ans=0;    for(int i=0;i<t;++i)    {        ans+=binary(0,t,sum1[i],t);    }    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击