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 }