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
",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 }
View Code
原文地址:https://www.cnblogs.com/hyxsolitude/p/3632589.html