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 -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).
AC代码:
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 4006 10 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 ",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 }