4 Values whose Sum is 0 UVA - 1152

4 Values whose Sum is 0

 UVA - 1152

题意:给n组4个数,问有多少种组合(每组选一个)使得四个数的和为零.

补个简单题...之前写的哈希表有问题一直没过就忘了,今天刚好看到~

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long 
 4 const int maxn = 4010;
 5 const int H_SZ = 16131313;
 6 
 7 int a[maxn][4];
 8 
 9 struct HS{
10     ll val[H_SZ], res[H_SZ];
11     int head[H_SZ], nex[H_SZ];
12     int cnt;
13 
14     void init(){
15         memset(head, -1, sizeof(head));
16         memset(res, 0, sizeof(res));
17         cnt = 0;
18     }
19 
20     void add(ll x) {
21         x += 1e11;
22         int u = x%H_SZ;
23         val[cnt] = x;
24         res[cnt] ++;
25         nex[cnt] = head[u];
26         head[u] = cnt++;
27     }
28 
29     int query(ll x) {
30         x += 1e11;
31         int u = x%H_SZ;
32         for(int i = head[u]; ~i; i = nex[i]) {
33             if(val[i] == x) return i;
34         }
35         return H_SZ;
36     }
37 }hs;
38 
39 int main(){
40     int t, kase = 0;
41     //freopen("in.txt", "r", stdin);
42     scanf("%d", &t);
43     while(t--) {
44         if(kase) puts("");
45         kase++;
46         hs.init();
47         int n;
48         scanf("%d", &n);
49         for(int i = 0; i < n; i++){
50             for(int j = 0; j < 4; j++) {
51                 scanf("%d", &a[i][j]);
52             }
53         }
54         for(int i = 0; i < n; i++){
55             for(int j = 0; j < n; j++){
56                 int x = a[i][0] + a[j][1];
57                 int id = hs.query(x);
58                 if(id == H_SZ) hs.add(x);
59                 else hs.res[id]++;
60             }
61         }
62         int ans = 0;
63         for(int i = 0; i < n; i++){
64             for(int j = 0; j < n; j++){
65                 int x = -(a[i][2] + a[j][3]);
66                 int id = hs.query(x);
67                 if(id != H_SZ) ans += hs.res[id]; 
68             }
69         }
70         printf("%d\n", ans);
71     }
72 }
View Code

 

posted @ 2017-10-05 11:17  yijiull  阅读(173)  评论(0编辑  收藏  举报