• uva 1152 4 Values whose Sum is 0


    Thinking about it:

       看到这题时,我马上想到了hdu 的 1496,这两题有异曲同工之处。我个人对hdu1496的题解:Click Here

      将所有第一第二个数的和a + b都保存起来,记录每个数出现的次数,然后计算每一个c + d,对于每一个c + d,查询-(c + d)出现几次就可。

      因此本题需要有一种方法保存将所有a + b的和及其出现次数保存起来。

      最直接的方法,就是使用STL中的map,但map在这种数据量较大时容易超时,所以这种方法在这里并不理想。

      另一种方法就是自己建立一个哈希表,因为和可能是负数,所以可以加上OFFSET,使所有和加上OFFSET的值都大于0,并且这个值作为key。而哈希表则可以采用一个vector数组表示。

    PS:

      相比我自己以前在hdu1496的做法,这次我很自然的想到了用vector表示哈希数组,方便了很多。一般来说,自己想到的方法应该更容易留下深刻的印象。

    Reference:

      0.http://acm.lilingfei.com/71_71

    Code:

    /**
     * AC @ Sep 2nd 2015
     */
    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    
    const int MAXN = 4000 + 50;
    const int hashsize = 999983; // 149993 -> 2.528s  299993 -> 2.205s  999983 -> 2.658
    const int OFFSET = 1 << 30;
    
    struct Node{
        int value;
        LL cnt;
        Node(int v, LL c){
            value = v;
            cnt = c;
        }
        Node(){}
    };
    
    int lst[MAXN][5], N;
    std::vector<Node> table[hashsize];
    
    void init() {
        for(int i=0; i<hashsize; ++ i) {
            table[i].clear();
        }
    }
    
    void read() {
        cin >> N;
        for(int i=0; i<N; ++ i) {
            for(int j=0; j<4; ++ j) {
                cin >> lst[i][j];
            }
        }
    }
    
    void insert(int sum) {
        int value = sum % hashsize;
        for (std::vector<Node>::iterator it = table[value].begin(); it != table[value].end(); ++it) {
            if (it->value==sum) {
                ++ it->cnt;
                return ;
            }
        }
        table[value].push_back(Node(sum, 1));
    }
    
    LL find(int sum) {
        int value = sum % hashsize;
        for (std::vector<Node>::iterator it = table[value].begin(); it != table[value].end(); ++it) {
            if(it->value == sum) {
                return it->cnt;
            }
        }
        return 0;
    }
    
    void work() {
        init();
        int sum;
        for(int i=0; i<N; ++ i) {
            for(int j=0; j<N; j++) {
                sum = lst[i][0] + lst[j][1];
                insert(sum + OFFSET);
            }
        }
        long long ans = 0;
        for(int i=0; i<N; ++ i) {
            for(int j=0; j<N; j++) {
                sum = lst[i][2] + lst[j][3];
                ans = ans + find(-sum + OFFSET);
            }
        }
        cout << ans << endl;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int T;
        cin >> T;
        while(T --) {
            read();
            work();
            if(T) {
                cout << endl;
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    getElementsByTagName 与 $(élement)的区别
    php面向对象学习笔记
    使用php添加定时任务
    JS中数组Array的用法
    大陆居民身份证真伪校验
    安卓 日常问题 工作日志15
    安卓 日常问题 工作日志14
    安卓 日常问题 工作日志13
    安卓 日常问题 工作日志12
    安卓 日常问题 工作日志11
  • 原文地址:https://www.cnblogs.com/Emerald/p/4779595.html
Copyright © 2020-2023  润新知