4 Values whose Sum is 0 poj2785

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

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).
这道题刚拿到手的时候完全没思路,但是暴力绝逼超时,先是想着用set后来发现不可行,二分尽然过了,,,,,
 1 #include <iostream>
 2 using namespace std;
 3 #include<string.h>
 4 #include<set>
 5 #include<stdio.h>
 6 #include<math.h>
 7 #include<queue>
 8 #include<map>
 9 #include<algorithm>
10 #include<cstdio>
11 #include<cmath>
12 #include<cstring>
13 #include <cstdio>
14 #include <cstdlib>
15 #include<cstring>
16 int a[4010],b[4010],c[4010],d[4010];
17 int a1[16000000],b1[16000000];
18 set<int>TM;
19 int main()
20 {
21     int t;
22     cin>>t;
23     for(int i=0;i<t;i++)
24         cin>>a[i]>>b[i]>>c[i]>>d[i];
25         int add=0;
26         for(int i=0;i<t;i++)
27             for(int j=0;j<t;j++)
28         {
29             b1[add]=(a[i]+b[j]);
30             a1[add++]=c[i]+d[j];
31         }
32         sort(b1,b1+add);
33         int sum=0;
34         for(int i=0;i<add;i++)
35         {
36             int tou=0,wei=add,zhongjian;
37             while(tou<=wei)
38             {
39                 zhongjian=(tou+wei)/2;
40                 if(a1[i]+b1[zhongjian]==0)
41                    {
42                        sum++;
43                 for(int j=zhongjian-1;j>=0;j--)
44                     {
45                     if(b1[j]!=b1[j+1])
46                     break;
47                      else
48                     sum++;
49                     }
50                 for(int j=zhongjian+1;j<add;j++)
51                    {
52                     if(b1[j]!=b1[j-1])
53                     break;
54                      else
55                     sum++;
56                    }
57                    break;
58                    }
59                    else if(a1[i]+b1[zhongjian]<0)
60                        tou=zhongjian+1;
61                    else
62                     wei=zhongjian-1;
63             }
64         }
65         cout<<sum<<endl;
66     return 0;
67 }
View Code
原文地址:https://www.cnblogs.com/dulute/p/7289192.html