zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JAVA中的注解小结
    终结任务
    共享资源访问
    基本线程机制
    HashSet、LinkedHashSet、TreeSet
    EnumMap
    LinkedHashMap及其源码分析
    集合迭代器快速失败行为及CopyOnWriteArrayList
    LinkedList
    比特币中的Base58 编码
  • 原文地址:https://www.cnblogs.com/hyxsolitude/p/3632589.html
Copyright © 2011-2022 走看看