1152 - 4 Values whose Sum is 0
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×B×C×D are such that a+b+c+d=0 . In the following, we assume that all lists have the same size n .
Input
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.
The first line of the input file contains the size of the lists
We then have
n
lines containing four integer values (with absolute value as large as
Output
For each test case, your program has to write the number quadruplets whose sum is zero.
The outputs of two consecutive cases will be separated by a blank line.
Sample Input
1
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
Sample Explanation: Indeed, the sum of the five following quadruplets is zero:
题意
四个大小为
n
的集合A,B,C,D,要求从每个集合中取出一个数字,使它们的和为
题解
用两个数组存放A,B集合和C,D集合可能的和值,排序后二分求解。
代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
#define fout freopen("out.txt","w",stdout)
#define fin freopen("in.txt","r",stdin)
using namespace std;
int T,n,A[4000],D[4000],C[4000],B[4000],num,ans;
int a,b;
const int INF=(1<<31)-1;
int sum[16000001],sum2[16000001];
int cal(int x,int *ary)
{
int *p=lower_bound(ary,ary+num,x);
int *q=upper_bound(ary,ary+num,x);
return q-p;
}
int main()
{
scanf("%d",&T);
while(T--)
{
ans=num=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
sum[num]=A[i]+B[j];
sum2[num++]=C[i]+D[j];
}
}
sort(sum,sum+num);
sort(sum2,sum2+num);
for(int i=0;i<num;i+=a)
{
a=cal(sum2[i],sum2);
b=cal(-sum2[i],sum);
ans+=a*b;
}
printf("%d\n",ans);
if(T)
putchar('\n');
}
return 0;
}