hdu-5183-Negative and Positive (NP)(hash模板)

题目链接

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 typedef long long LL;
 9 
10 const int MAXN=1000010;
11 const int HASH=1000007;
12 
13 inline LL read()//输入外挂
14 {
15     char ch=getchar();LL x=0,f=1;
16     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
17     while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 
21 struct hashmap//建立哈希表
22 {
23     LL a[MAXN];
24     int head[HASH],next[MAXN],size;
25     void init(){//初始化
26         memset(head,-1,sizeof(head));
27         size=0;
28     }
29     bool find(LL val){//查找一个元素是否在哈希表内,一个hash值可能对应多个值,在这几个值中查找 
30         int tmp = (val%HASH + HASH)%HASH;
31         for(int i = head[tmp];i!=-1;i=next[i])
32             if(val==a[i]) return true;
33         return false;
34     }
35     void add(LL val){//添加元素到哈希表中
36         int tmp =(val%HASH+HASH)%HASH;
37         if(find(val)) return;
38         a[size]=val;
39         next[size]=head[tmp];//冲突值对应同一个 hash值 
40         head[tmp]=size++;//head保存每个值的下标 
41     }
42 }h1,h2;
43 
44 LL a[MAXN];
45 
46 int main()
47 {
48     int t,n,cas=1,k;
49     t=read();
50     while(t--){
51         n=read();
52         k=read();
53         for(int i=0;i<n;i++)
54             a[i]=read();
55         LL sum=0;
56         h1.init(),h2.init();
57         h1.add(0),h2.add(0);
58         bool flag = 0;
59         for(int i=n-1;i>=0;i--){
60             if(i&1) sum-=a[i];
61             else sum+=a[i];
62             if(i%2==0){
63                 if(h1.find(sum-k)) flag=1;
64             }
65             else{
66                 if(h1.find(sum+k)) flag=1;
67             }
68             h1.add(sum);
69             h2.add(-sum);
70             if(flag) break;
71         }
72         printf("Case #%d: ",cas++);
73         if(flag)puts("Yes.");
74         else puts("No.");
75     }
76     return 0;
77 }

 

posted @ 2018-04-14 16:20  朤尧  阅读(265)  评论(0编辑  收藏  举报