• poj 2785 4 Values whose Sum is 0(折半枚举(双向搜索))


    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).

    AC代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <set>
     7 using namespace std;
     8 #define ll long long
     9 #define N 4006
    10 int n;
    11 int mp[N][N];
    12 int A[N],B[N],C[N],D[N];
    13 int CD[N*N];
    14 void solve(){
    15    for(int i=0;i<n;i++){
    16        for(int j=0;j<n;j++){
    17           CD[i*n+j]=C[i]+D[j];
    18        }
    19    }
    20    sort(CD,CD+n*n);
    21    ll ans=0;
    22    for(int i=0;i<n;i++){
    23        for(int j=0;j<n;j++){
    24           int cd = -(A[i]+B[j]);
    25           ans+=upper_bound(CD,CD+n*n,cd)-lower_bound(CD,CD+n*n,cd);
    26        }
    27    }
    28    printf("%I64d
    ",ans);
    29 }
    30 int main()
    31 {
    32     while(scanf("%d",&n)==1){
    33        for(int i=0;i<n;i++){
    34           for(int j=0;j<4;j++){
    35              scanf("%d",&mp[i][j]);
    36           }
    37        }
    38        for(int i=0;i<n;i++){
    39           A[i] = mp[i][0];
    40           B[i] = mp[i][1];
    41           C[i] = mp[i][2];
    42           D[i] = mp[i][3];
    43        }
    44        solve();
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    ng -v 不是内部或外部命令
    更改package.js后重新加载
    表格添加滚动条
    eclispse指针变成十字型
    清除输入框缓存数据
    用cd 命令进入和退出D盘文件夹的操作步骤。
    npm ERR! cb() never called! npm ERR! This is an error with npm itself. Pleas
    离开电脑时锁定电脑
    slice
    golang之字符串
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/5502277.html
Copyright © 2020-2023  润新知