POJ 2785
4 Values whose Sum is 0
Time Limit: 15000MS | Memory Limit: 228000K | |
Total Submissions: 14475 | Accepted: 4138 | |
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 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).
Source
折半枚举,然后二分。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int MAX = 4005; 9 10 typedef long long ll; 11 12 int N; 13 int a[5][MAX]; 14 int cd[MAX * MAX]; 15 16 void solve() { 17 ll res = 0; 18 19 for(int i = 1; i <= N; ++i) { 20 for(int j = 1; j <= N; ++j) { 21 cd[(i - 1) * N + j] = a[3][i] + a[4][j]; 22 } 23 } 24 sort(cd + 1,cd + N * N + 1); 25 26 for(int i = 1; i <= N; ++i) { 27 for(int j = 1; j <= N; ++j) { 28 int x = -(a[1][i] + a[2][j]); 29 res += upper_bound(cd + 1,cd + N * N + 1,x) - 30 lower_bound(cd + 1,cd + N * N + 1,x); 31 32 } 33 } 34 35 printf("%I64d\n",res); 36 37 38 } 39 40 int main() 41 { 42 // freopen("sw.in","r",stdin); 43 scanf("%d",&N); 44 for(int i = 1; i <= N; ++i) { 45 for(int j = 1; j <= 4; ++j) { 46 scanf("%d",&a[j][i]); 47 } 48 } 49 50 solve(); 51 52 return 0; 53 }