4 Values whose Sum is 0
Time Limit: 15000MS |
|
Memory Limit: 228000K |
Total submissions: 20020 |
|
accepted: 5977 |
Case Time Limit: 5000MS |
Description The SUM problem can be formulated as Follows:given four lists A, B, C, D of an 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 so all lists have the same size n.
Input the the ' the ' input file contains the size of the lists n (this value can as large as 4000). We then have n lines containing four integer values (with absolute value as large as 2) 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 42-16
-41-27
-36 53-37
-36 30-75-46
26-38-10
45 -32-54-6
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).
To select one of the four groups to meet the number of a+b+c+d==0.
The direct use of BFS time complexity is O (n^4), obviously will time out, we can divide the whole four sets of data into two groups, and then is to two sets of data separately BFS, the final statistical results, so that the complexity of the Times reduced to O (n^2), it is easy to go through the ~
AC Code:
#include <cstdio> #include <math.h> #include <iostream> #include <algorithm>
#define MAX (A,B) (A>B?A:B) using namespace std;
__int64 a[4005],b[4005],c[4005],d[4005];
__int64 cd[4005*4005];
int main () {int n;
scanf ("%d", &n);
for (int i=0; i<n; i++) scanf ("%i64d%i64d%i64d%i64d", a+i,b+i,c+i,d+i);
for (int i=0; i<n; i++) for (int j=0; j<n; j + +) Cd[i*n+j]=c[i]+d[j];
Sort (cd,cd+n*n);
__int64 ans=0;
for (int i=0; i<n; i++) for (int j=0; j<n; J + +) {__int64 ab=-(a[i]+b[j));
Ans+=upper_bound (Cd,cd+n*n,ab)-lower_bound (CD,CD+N*N,AB);
printf ("%i64d\n", ans);
return 0; }