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

const int HASH = ;
struct HASHMAP
{
int head[HASH],next[MAXN],size;
long long state[MAXN];
void init()
{
size = ;
memset(head,-,sizeof(head));
}
bool check(long long val){
int h = (val%HASH+HASH)%HASH;
for(int i = head[h];i != -;i = next[i])
if(val == state[i])
return true;
return false;
}
int insert(long long val)
{
int h = (val%HASH+HASH)%HASH;
for(int i = head[h]; i != -;i = next[i])
if(val == state[i])
{
return ;
}
state[size] = val;
next[size] = head[h];
head[h] = size++;
return ;
}
} H1,H2;

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

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

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

template <class T>
inline bool scan_d(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return ; //EOF
while(c!='-'&&(c<''||c>'')) c=getchar();
sgn=(c=='-')?-:;
ret=(c=='-')?:(c-'');
while(c=getchar(),c>=''&&c<='') ret=ret*+(c-'');
ret*=sgn;
return ;
}

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

 #include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 1000010
#define LL long long
int a[MAXN];
LL S1,S2;
LL k;
int n,TC; const int HASH = ;
struct HASHMAP
{
int head[HASH],next[MAXN],size;
long long state[MAXN];
void init()
{
size = ;
memset(head,-,sizeof(head));
}
bool check(long long val){
int h = (val%HASH+HASH)%HASH;
for(int i = head[h];i != -;i = next[i])
if(val == state[i])
return true;
return false;
}
int insert(long long val)
{
int h = (val%HASH+HASH)%HASH;
for(int i = head[h]; i != -;i = next[i])
if(val == state[i])
{
return ;
}
state[size] = val;
next[size] = head[h];
head[h] = size++;
return ;
}
} H1,H2; template <class T>
inline bool scan_d(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return ; //EOF
while(c!='-'&&(c<''||c>'')) c=getchar();
sgn=(c=='-')?-:;
ret=(c=='-')?:(c-'');
while(c=getchar(),c>=''&&c<='') ret=ret*+(c-'');
ret*=sgn;
return ;
} int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&TC);
for (int TT=;TT<=TC;TT++)
{
scanf("%d%I64d",&n,&k);
for (int i=;i<n;i++)
scan_d(a[i]);
//scanf("%d",&a[i]); bool ans=false;
H1.init();
H2.init();
H1.insert();
//H2.insert(0);
S1=a[]; S2=-a[];
if (H1.check(S1-k)) ans=true;
if (H2.check(S2-k)) ans=true;
H2.insert(S2); for (int i=;i<n;i++)
{
if (i%==)
{
S1=S1+a[i];
S2=S2-a[i];
H2.insert(S2);
}
else
{
S2=S2+a[i];
S1=S1-a[i];
H1.insert(S1);
}
if (H1.check(S1-k))
ans=true;
if (H2.check(S2-k))
ans=true;
if (ans) break;
} printf("Case #%d: ",TT);
if (ans) printf("Yes.\n"); else printf("No.\n");
}
return ;
}

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. dotnetGen 系列终于开源了

    https://github.com/2881099/dotnetGen .Net 3.0 + SqlServer 生成器 https://github.com/2881099/dotnetGen_s ...

  2. 阿里云修改默认的ssh端口

    Linux服务器的ssh服务支持远程访问服务器,默认的ssh端口号是22.为了安全起见,很多用户会将端口号由22改为其他的端口号.  如果遇到修改端口号并重启ssh服务后,新的端口号不生效,请参考以下 ...

  3. 采用dlopen、dlsym、dlclose加载动态链接库【总结】(转)

    1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...

  4. 清北学堂2017NOIP冬令营入学测试P4749 C’s problem(c)

    P4746 C's problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比较差 ...

  5. Caffe学习系列(22):caffe图形化操作工具digits运行实例

    上接:Caffe学习系列(21):caffe图形化操作工具digits的安装与运行 经过前面的操作,我们就把数据准备好了. 一.训练一个model 右击右边Models模块的” Images" ...

  6. SUBLIME TEXT 2中,光标移入移出括号的快捷键设置

    无赖右方向键→和End键都在键盘的另一边,每次输入完一个函数,光标在各种括号中间,有什么更好的方式将光标移出来呢?在Sublime Text 2中,我们可以自己设置快捷键: { "keys& ...

  7. 浅谈JS继承

    今天呢,我们来谈谈继承,它也是JS语言中的一大重点,一般什么时候我们会用继承呢,比如有两个拖拽的面板,两个功能基本一致,只是第二个面板多了一些不同的东西,这个时候,我们就会希望,要是第二个直接能继承第 ...

  8. JQuery fullCalendar 时间差 排序获取距当前最近的时间。

    let time = (wo: WoDto) => wo.ScheduleTime || wo.ScheduleStartTime; let wo = technician.wos .filte ...

  9. VS2010+MVC4+Spring.NET2+NHibernate4-传统三层架构-前篇

    VS2010+MVC4+Spring.NET2+NHibernate4 - 传统三层架构 - 前篇 一直追求使用开源项目,就因一个字:懒! 一直想整理一下的,却一直懒到现在!从当初用的MVC3到现在的 ...

  10. Ubuntu下安装支付宝安全控件

    在淘宝购物时,安装支付宝安全控件.下载了一个文件.tar.gz(非常小的一个文件). tar -zxvf 解压之,只有一个aliedit.sh文件,运行这个文件就安装成功了,重启firefox就可以用 ...