4 Values whose Sum is 0
Time Limit: 15000MS | Memory Limit: 228000K | |
Total Submissions: 20197 | Accepted: 6053 | |
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).
Source
题目大意:
一共四个集合,(每一列输入为一个集合),从每一个集合中拿出一个数使四个数和为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);
}
}