4 Values whose Sum is 0
Time Limit: 15000MS | Memory Limit: 228000K | |
Total Submissions: 15284 | Accepted: 4386 | |
Case Time Limit: 5000MS |
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 2
28 ) 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
解决方案:先两个两个一起,对其中一个排序,最后二分答案。
code:#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define MMAX 4004 using namespace std; int A[MMAX],B[MMAX],C[MMAX],D[MMAX],AB[MMAX*MMAX],CD[MMAX*MMAX]; int n; int main() { while(~scanf("%d",&n)) { for(int i=0; i<n; i++) { scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]); } int k=0; for(int i=0; i<n; i++) for(int j=0; j<n; j++) { AB[k]=A[i]+B[j]; CD[k++]=C[i]+D[j]; } sort(AB,AB+k); int cnt=0; for(int i=0; i<k; i++) { int low=0,high=k-1,mid; while(low<high) { mid=low+(high-low)/2; if(AB[mid]+CD[i]>0) { high=mid; } else low=mid+1; } if((AB[low]+CD[i])!=0) low--; int temp=low; low=0,high=k-1; while(low<high) { mid=low+(high-low)/2; if(AB[mid]+CD[i]>=0) { high=mid; } else low=mid+1; } low--; cnt+=(temp-low); } printf("%d\n",cnt); } return 0; }