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 -4626 -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).
AC code:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <set> 7 using namespace std; 8 #define ll long long 9 #define N 400610 int n;11 int mp[N][N];12 int A[N],B[N],C[N],D[N];13 int CD[N*N];14 void solve(){15 for(int i=0;i<n;i++){16 for(int j=0;j<n;j++){17 CD[i*n+j]=C[i]+D[j];18 }19 }20 sort(CD,CD+n*n);21 ll ans=0;22 for(int i=0;i<n;i++){23 for(int j=0;j<n;j++){24 int cd = -(A[i]+B[j]);25 ans+=upper_bound(CD,CD+n*n,cd)-lower_bound(CD,CD+n*n,cd);26 }27 }28 printf("%I64d\n",ans);29 }30 int main()31 {32 while(scanf("%d",&n)==1){33 for(int i=0;i<n;i++){34 for(int j=0;j<4;j++){35 scanf("%d",&mp[i][j]);36 }37 }38 for(int i=0;i<n;i++){39 A[i] = mp[i][0];40 B[i] = mp[i][1];41 C[i] = mp[i][2];42 D[i] = mp[i][3];43 }44 solve();45 }46 return 0;47 }
Poj 2785 4 values whose sum is 0 (half enumeration (bidirectional search ))