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 .
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 .
For each input file, your program has to write the number quadruplets whose sum is zero.
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
5
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).
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[4010][6];
int s1[16000100];
int s2[16000100];
int n,k2=1;
int sum;
void judge(int a1)
{
int st=1;
int en=k2;
while(st<=en)
{
int l=(st+en)/2;
if(s2[l]==a1)
{
sum++;
for(int i=l+1;i<=k2;++i)
if(s2[i]==a1)
sum++;
else break;
for(int i=l-1;i>0;--i)
if(s2[i]==a1)
sum++;
else break;
return;
}
else if(a1<s2[l])
{
en=l-1;
}
else
{
st=l+1;
}
}
}
int main()
{
while(cin>>n)
{
int k1=1;
for(int i=1; i<=n; ++i)
for(int j=1; j<=4; ++j)
cin>>a[i][j];
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
s1[k1++]=a[i][1]+a[j][2];
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
s2[k2++]=a[i][3]+a[j][4];
sum=0;
sort(s2+1,s2+k2);
k2--;
for(int i=1; i<k1; ++i)
{
judge(-s1[i]);
}
printf("%d\n",sum);
}
}