维护前缀和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)

注意一个tips:scanf读long long的时候别忘了%I64d,否则会出错

------注意几个黑科技orz-------

1.这题丧心病狂到了卡常数的程度= =,所以hash的时候用map肯定是不行的。。。。

借助了kuangbin原创的hash模板orz

  1. const int HASH = ;
  2. struct HASHMAP
  3. {
  4. int head[HASH],next[MAXN],size;
  5. long long state[MAXN];
  6. void init()
  7. {
  8. size = ;
  9. memset(head,-,sizeof(head));
  10. }
  11. bool check(long long val){
  12. int h = (val%HASH+HASH)%HASH;
  13. for(int i = head[h];i != -;i = next[i])
  14. if(val == state[i])
  15. return true;
  16. return false;
  17. }
  18. int insert(long long val)
  19. {
  20. int h = (val%HASH+HASH)%HASH;
  21. for(int i = head[h]; i != -;i = next[i])
  22. if(val == state[i])
  23. {
  24. return ;
  25. }
  26. state[size] = val;
  27. next[size] = head[h];
  28. head[h] = size++;
  29. return ;
  30. }
  31. } H1,H2;

init:初始化  insert:插入  check:查找是否存在

2.Huge Data,还需要读入优化:

基本思想就是把输入数据以一个一个字符的形式读入

  1. template <class T>
  2. inline bool scan_d(T &ret) {
  3. char c; int sgn;
  4. if(c=getchar(),c==EOF) return ; //EOF
  5. while(c!='-'&&(c<''||c>'')) c=getchar();
  6. sgn=(c=='-')?-:;
  7. ret=(c=='-')?:(c-'');
  8. while(c=getchar(),c>=''&&c<='') ret=ret*+(c-'');
  9. ret*=sgn;
  10. return ;
  11. }

使用方法:scan_d(a[i]);

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. #define MAXN 1000010
  5. #define LL long long
  6. int a[MAXN];
  7. LL S1,S2;
  8. LL k;
  9. int n,TC;
  10.  
  11. const int HASH = ;
  12. struct HASHMAP
  13. {
  14. int head[HASH],next[MAXN],size;
  15. long long state[MAXN];
  16. void init()
  17. {
  18. size = ;
  19. memset(head,-,sizeof(head));
  20. }
  21. bool check(long long val){
  22. int h = (val%HASH+HASH)%HASH;
  23. for(int i = head[h];i != -;i = next[i])
  24. if(val == state[i])
  25. return true;
  26. return false;
  27. }
  28. int insert(long long val)
  29. {
  30. int h = (val%HASH+HASH)%HASH;
  31. for(int i = head[h]; i != -;i = next[i])
  32. if(val == state[i])
  33. {
  34. return ;
  35. }
  36. state[size] = val;
  37. next[size] = head[h];
  38. head[h] = size++;
  39. return ;
  40. }
  41. } H1,H2;
  42.  
  43. template <class T>
  44. inline bool scan_d(T &ret) {
  45. char c; int sgn;
  46. if(c=getchar(),c==EOF) return ; //EOF
  47. while(c!='-'&&(c<''||c>'')) c=getchar();
  48. sgn=(c=='-')?-:;
  49. ret=(c=='-')?:(c-'');
  50. while(c=getchar(),c>=''&&c<='') ret=ret*+(c-'');
  51. ret*=sgn;
  52. return ;
  53. }
  54.  
  55. int main()
  56. {
  57. //freopen("in.txt","r",stdin);
  58. scanf("%d",&TC);
  59. for (int TT=;TT<=TC;TT++)
  60. {
  61. scanf("%d%I64d",&n,&k);
  62. for (int i=;i<n;i++)
  63. scan_d(a[i]);
  64. //scanf("%d",&a[i]);
  65.  
  66. bool ans=false;
  67. H1.init();
  68. H2.init();
  69. H1.insert();
  70. //H2.insert(0);
  71. S1=a[]; S2=-a[];
  72. if (H1.check(S1-k)) ans=true;
  73. if (H2.check(S2-k)) ans=true;
  74. H2.insert(S2);
  75.  
  76. for (int i=;i<n;i++)
  77. {
  78. if (i%==)
  79. {
  80. S1=S1+a[i];
  81. S2=S2-a[i];
  82. H2.insert(S2);
  83. }
  84. else
  85. {
  86. S2=S2+a[i];
  87. S1=S1-a[i];
  88. H1.insert(S1);
  89. }
  90. if (H1.check(S1-k))
  91. ans=true;
  92. if (H2.check(S2-k))
  93. ans=true;
  94. if (ans) break;
  95. }
  96.  
  97. printf("Case #%d: ",TT);
  98. if (ans) printf("Yes.\n"); else printf("No.\n");
  99. }
  100. return ;
  101. }

HASH大法有时候真的蛮重要的orz

hdu5183 hash大法的更多相关文章

  1. Hash大法

    内容参考<算法竞赛进阶指南> 之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分. hash涉及内容很多,这里只讨论字符串hash 可 ...

  2. NOIP 2014 D2T3 解方程 Hash大法好

    题目大意:给定高次方程an*x^n+...+a1*x^1+a0*x^0=0 求[1,m]区间内有多少个整数根 ai<=10^10000.m<=100W 懒得高精,考场上写的long dou ...

  3. HDU5183 hash 表

    做题的时候忘了 数据结构老师说的hash表了, 用二分找,还好过了, hash 表 对这题 更快一些 #include <iostream> #include <algorithm& ...

  4. LeetCodeTwo Sum IV 树的遍历+Hash大法好

    题意 给定一颗二叉搜索树,返回是否存在两个节点的值之和为给定值K. 思路 同Two Sum.使用Hash表解决.只是要写个树的遍历而已,选取DFS. 源码 class Solution { publi ...

  5. POJ 1743 Musical Theme Hash+二分法

    标题效果:有一个美丽的旋律,它们是由一些不大于88音调.如果计为五个音调的量度,问:是否有相同的节奏的多个部分(相同的差,以及两者之间的相同的节奏不能重叠),并寻求最长长度. 思考:这个问题是八人中的 ...

  6. 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列

    hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...

  7. LeetCode longest substring without repeating characters 题解 Hash表

    题目 Given a string, find the length of the longest substring without repeating characters. Example 1: ...

  8. 【Tyvj 1060】【NOIP 2005】等价表达式

    设a为一个质数,模数为另一个质数,然后暴力算多项式的答案,如果答案相等就认为两个多项式相等. 这种hash有出错概率的题为什么还是要用hash呢?因为出错的概率实在太小了,a和模数的值取得好出题人根本 ...

  9. bzoj4264: 小C找朋友

    hash大法好 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...

随机推荐

  1. java:如何用代码控制H2 Database启动

    1.纯手动start/stop package com.cnblogs.yjmyzz.h2; import java.sql.Connection; import java.sql.DriverMan ...

  2. 如何在前台脚本通过json传递数据到后台(使用微软自带的ajax)

    首先,我们要在前台引入json的脚本,以便于把js对象序列化 <script type="text/javascript" src="/js/jquery.json ...

  3. Python2.3-原理之语句和语法

    此节来自于<Python学习手册第四版>第三部分 一.python语句简介(第10章) 1.首先记得一个概念:a.程序由模块构成:b.模块包含语句:c.语句包含表达式:d.表达式建立并处理 ...

  4. css3实践之图片轮播(Transform,Transition和Animation)

    楼主喜欢追求视觉上的享受,虽常以牺牲性能无法兼容为代价却也乐此不疲.本文就通过一个个的demo演示来简单了解下css3下的Transform,Transition和Animation. 本文需要实现效 ...

  5. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)

    继上一次介绍了<神奇的六边形>的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏<跳跃的方块>的完整开发流程. (点击图片可进入游戏体验) 因内容太多,为 ...

  6. NPOI导出

    <body> @using (Html.BeginForm("ImportCommentsFile", "CommentsManage", Form ...

  7. DNS资源纪录(Resource Record)介绍

          http://dns-learning.twnic.net.tw/bind/intro6.html 类型 SOA NS A AAAA PTR CNAME MX -------------- ...

  8. hiho一下 第六十四周 Right-click Context Menu

    题目链接:hihocoder 第64周 题意概述: 上下文菜单是panel(面板)包括很多section(分区),一个分区里面至少包含一个菜单项.每一个菜单项都对应有一个子panel,这个panel可 ...

  9. Mybatis——oracle 的模糊查询 和 日期处理

    第一种 1 <if test="AGTNAM !=null and AGTNAM !=''"> <![CDATA[and AGTNAM like concat(c ...

  10. Entity Framework Code First (七)空间数据类型 Spatial Data Types

    声明:本文针对 EF5+, Visual Studio 2012+ 空间数据类型(Spatial Data Types)是在 EF5 中引入的,空间数据类型表现有两种: Geography (地理学上 ...