hdu5183 HASHMAP的判重

其实就是放了1000007个桶,将已有值放入对应桶中然后判存在就是寻找该桶内元素,如果数据刁钻会退化成n2呀===

这题还有一个技巧,就是可以利用一个hash就可以

先预处理出a[1]-a[2]+a[3]-a[4]....

将sum[n]放入桶中,然后从i-1循环到0,如果i为偶寻找sum[i]+k,否则寻找sum[i]-k,思考==

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define MAXN 1000010
 5 #define HASH 1000007
 6 #define LL long long
 7 struct HASHMAP
 8 {
 9   int head[HASH],next[MAXN],size;
10   LL value[MAXN];
11   void init()
12   {
13     size=0;
14     memset(head,-1,sizeof(head));
15   }
16   bool check(LL val)
17   {
18     int h=(val%HASH+HASH)%HASH;
19     for (int i=head[h];i!=-1;i=next[i])
20       if (val==value[i]) return true;
21     return false;
22   }
23   int insert(LL val)
24   {
25     int h=(val%HASH+HASH)%HASH;
26     for (int i=head[h];i!=-1;i=next[i])
27       if (val==value[i]) return 1;
28     next[++size]=head[h];
29     head[h]=size;
30     value[size]=val;
31     return 0;
32   }
33 }H;
34 LL sum[1000005];
35 int main()
36 {
37   LL t,T,n,k,i,x,judge;
38   scanf("%I64d",&T);
39   for (t=1;t<=T;t++)
40   {
41     scanf("%I64d%I64d",&n,&k);
42     H.init(); sum[0]=0;
43     for (i=1;i<=n;i++)
44     {
45       scanf("%I64d",&x);
46       if (i&1) sum[i]=sum[i-1]+x;
47       else sum[i]=sum[i-1]-x;
48     }
49     H.insert(sum[n]);
50     judge=0;
51     for (i=n-1;i>=0;i--)
52     {
53       if (i%2==0&&H.check(sum[i]+k)) {judge=1; break; }
54       if (i%2&&H.check(sum[i]-k)) {judge=1; break; }
55       H.insert(sum[i]);
56     }
57     printf("Case #%I64d: ",t);
58     if (judge) printf("Yes.\n");
59     else printf("No.\n");
60   }
61   return 0;
62 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183

posted on 2015-03-15 19:20  xiao_xin  阅读(284)  评论(0编辑  收藏  举报

导航