BC#32 1002 hash

代码引用kuangbin大神的,膜拜

第一次见到hashmap和外挂,看来还有很多东西要学

维护前缀和sum[i]=a[0]-a[1]+a[2]-a[3]+…+(-1)^i*a[i]
枚举结尾i,然后在hash表中查询是否存在sum[i]-K的值。
如果当前i为奇数,则将sum[i]插入到hash表中。
上面考虑的是从i为偶数为开头的情况。
然后再考虑以奇数开头的情况,按照上述方法再做一次即可。
不同的是这次要维护的前缀和是sum[i]=-(a[0]-a[1]+a[2]-a[3]+…+(-1)^i*a[i])
I为偶数的时候将sum[i]插入到hash表。
总复杂度o(n)
  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <vector>
  6 #include <queue>
  7 #include <set>
  8 #include <map>
  9 #include <string>
 10 #include <math.h>
 11 #include <stdlib.h>
 12 #include <time.h>
 13 using namespace std;
 14 const int MAXN = 1000010;
 15 int a[MAXN];
 16 
 17 const int HASH = 1000007;
 18 struct HASHMAP
 19 {
 20     int head[HASH],next[MAXN],size;
 21     long long state[MAXN];
 22     void init()
 23     {
 24         size = 0;
 25         memset(head,-1,sizeof(head));
 26     }
 27     bool check(long long val){
 28         int h = (val%HASH+HASH)%HASH;
 29         for(int i = head[h];i != -1;i = next[i])
 30             if(val == state[i])
 31                 return true;
 32         return false;
 33     }
 34     int insert(long long val)
 35     {
 36         int h = (val%HASH+HASH)%HASH;
 37         for(int i = head[h]; i != -1;i = next[i])
 38             if(val == state[i])
 39             {
 40                 return 1;
 41             }
 42         state[size] = val;
 43         next[size] = head[h];
 44         head[h] = size++;
 45         return 0;
 46     }
 47 } H1,H2;
 48 template <class T>
 49 inline bool scan_d(T &ret) {
 50    char c; int sgn;
 51    if(c=getchar(),c==EOF) return 0; //EOF
 52    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
 53    sgn=(c=='-')?-1:1;
 54    ret=(c=='-')?0:(c-'0');
 55    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
 56    ret*=sgn;
 57    return 1;
 58 }
 59 
 60 
 61 int main()
 62 {
 63     //freopen("in.txt","r",stdin);
 64     //freopen("out.txt","w",stdout);
 65     int T;
 66     int iCase = 0;
 67     scanf("%d",&T);
 68     while(T--){
 69         iCase++;
 70         int n;
 71         long long K;
 72         scanf("%d%I64d",&n,&K);
 73         for(int i = 0;i < n;i++)
 74             scan_d(a[i]);
 75         H1.init();
 76         H2.init();
 77         long long sum = 0;
 78         bool flag = false;
 79         H1.insert(0);
 80         H2.insert(0);
 81         for(int i = n-1;i >= 0;i--){
 82             if(i&1)sum -= a[i];
 83             else sum += a[i];
 84             if(i%2 == 0){
 85                 if(H1.check(sum-K))
 86                     flag = true;
 87             }
 88             else {
 89                 if(H2.check(-sum-K))
 90                     flag = true;
 91             }
 92             if(flag)break;
 93             H1.insert(sum);
 94             H2.insert(-sum);
 95         }
 96         if(flag)printf("Case #%d: Yes.
",iCase);
 97         else printf("Case #%d: No.
",iCase);
 98     }
 99     return 0;
100 }