Poj 2785 4 Values whose Sum is 0【二分】

来源:互联网 发布:淘宝网开店 编辑:程序博客网 时间:2024/05/22 02:34

4 Values whose Sum is 0
Time Limit: 15000MS Memory Limit: 228000KTotal Submissions: 20197 Accepted: 6053Case 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 -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).

Source

Southwestern Europe 2005

题目大意:

一共四个集合,(每一列输入为一个集合),从每一个集合中拿出一个数使四个数和为0,一共有多少种选取方法。


思路:


将a+b+c+d==0转化为:a+b==-c-d;


1、首先考虑将集合c中的数和集合d中的数加起来存在数组cd【】中。


2、然后枚举a【i】+b【j】的值作为tmp,tmp=a【i】+b【j】,那么我们需要在数组cd【】中,找到最左边的-tmp位子作为zuo,和最右边的-tmp的位子作为you,那么其解ans+=you-zuo+1;


Ac代码:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int a[5000];int b[5000];int c[5000];int d[5000];int cd[5000*5000];int n;int Erfendd(int tmp){    int l=0;    int r=n*n-1;    int mid;    int ans=-1;    while(r>=l)    {        mid=(l+r)/2;        if(cd[mid]>=tmp)        {            r=mid-1;            if(cd[mid]==tmp)            {                ans=mid;            }        }        else l=mid+1;    }    return ans;}int Erfenuu(int tmp){    int l=0;    int r=n*n-1;    int mid;    int ans=-1;    while(r>=l)    {        mid=(l+r)/2;        if(cd[mid]>tmp)        {            r=mid-1;        }        else        {            l=mid+1;            if(cd[mid]==tmp)            {                ans=mid;            }        }    }    return ans;}int main(){    while(~scanf("%d",&n))    {        for(int j=0;j<n;j++)        {            for(int i=0;i<4;i++)            {                if(i==0)scanf("%d",&a[j]);                if(i==1)scanf("%d",&b[j]);                if(i==2)scanf("%d",&c[j]);                if(i==3)scanf("%d",&d[j]);            }        }        int cont=0;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                cd[cont++]=c[i]+d[j];            }        }        int ans=0;        sort(cd,cd+cont);        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                int tmp=a[i]+b[j];                tmp=-tmp;                int zuo=Erfendd(tmp);                if(zuo==-1)continue;                int you=Erfenuu(tmp);                ans+=you-zuo+1;            }        }        printf("%d\n",ans);    }}




0 0
原创粉丝点击