• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LyonLys
愿意在角落唱沙哑的歌 再大声也都是给你 请用心听 不要说话 Contact me via E-mail: lyon.lys@gmail.com
博客园    首页    新随笔    联系   管理    订阅  订阅

poj 2785 4 Values whose Sum is 0

http://poj.org/problem?id=2785

  简单hash,不过不能用set,而且数组不能开太大。

  才几十行的代码,当时个人赛居然不会... - -

View Code
 1 #include <cstdlib>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 
 7 const int maxn = 4001;
 8 const int mod = 15999997;
 9 int hash[maxn * maxn], cnt[maxn * maxn];
10 int rec[maxn][4];
11 
12 void insert(int n){
13     int p = (n << 2) % mod;
14 
15     if (p < 0) p += mod;
16     while (cnt[p] && hash[p] != n) p++;
17     hash[p] = n;
18     cnt[p]++;
19 }
20 
21 int count(int n){
22     int p = (n << 2) % mod;
23 
24     if (p < 0) p += mod;
25     while (cnt[p] && hash[p] != n) p++;
26     return cnt[p];
27 }
28 
29 int deal(int n){
30     memset(cnt, 0, sizeof(cnt));
31     for (int i = 0; i < n; i++){
32         for (int j = 0; j < n; j++){
33             insert(rec[i][0] + rec[j][1]);
34         }
35     }
36     int ret = 0;
37 
38     for (int i = 0; i < n; i++){
39         for (int j = 0; j < n; j++){
40             ret += count(- rec[i][2] - rec[j][3]);
41         }
42     }
43 
44     return ret;
45 }
46 
47 int main(){
48     int n;
49 
50     while (~scanf("%d", &n)){
51         for (int i = 0; i < n; i++){
52             for (int j = 0; j < 4; j++){
53                 scanf("%d", &rec[i][j]);
54             }
55         }
56         printf("%d\n", deal(n));
57     }
58 
59     return 0;
60 }

 

——written by Lyon

posted @ 2012-09-02 00:38  LyonLys  阅读(130)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3