• POJ 2785 4 Values whose Sum is 0


    4 Values whose Sum is 0
    Time Limit: 15000MS   Memory Limit: 228000K
    Total Submissions: 20015   Accepted: 5974
    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

     
     
     
    解析:折半枚举。直接从4个数列中选择的话有n4种情况,时间复杂度太高,不可取。可以采取折半枚举的方式,将A、B、 C、 D分为AB和CD考虑,从A、B中取出a、b后,为了使总和为0则需要从C、D中取出c+d = -(a+b)。所以先将C、D取数的n2种方法枚举出来,并排好序,这样就可以运用二分搜索了,时间复杂度为O(n2logn2)。
     
     
     
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #define ll long long
    using namespace std;
    
    const int MAXN = 4000+5;
    int a[MAXN], b[MAXN], c[MAXN], d[MAXN];
    int cd[MAXN*MAXN];
    int n;
    pair<vector<int>::iterator, vector<int>::iterator> it;
    
    void solve()
    {
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < n; ++j){
                cd[i*n+j] = c[i]+d[j];
            }
        }
        sort(cd, cd+n*n);
        ll res = 0;
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < n; ++j){
                int c_d = -(a[i]+b[j]);
                it = equal_range(cd, cd+n*n, c_d);
                res += it.second-it.first;
            }
        }
        printf("%I64d
    ", res);
    }
    
    int main()
    {
        scanf("%d", &n);
        for(int i = 0; i < n; ++i)
            scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
        solve();
        return 0;
    }
    

      

      

  • 相关阅读:
    [HAOI2015]树上染色 [树形dp]
    【luogu1052】 过河 [动态规划]
    【luogu4819】 [中山市选]杀人游戏 [tarjan 缩点]
    【luogu4185】 [USACO18JAN]MooTube [并查集]
    [国家集训队]墨墨的等式 [差分约束]
    【RMQ】
    [USACO05DEC] 布局 [差分约束]
    [SCOI2011]糖果 [差分约束]
    【POJ 1201】Intervals
    【luogu1993】 小K的农场 [差分约束]
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/5758303.html
Copyright © 2020-2023  润新知