hdu5183 hash大法
维护前缀和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大法的更多相关文章
- Hash大法
内容参考<算法竞赛进阶指南> 之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分. hash涉及内容很多,这里只讨论字符串hash 可 ...
- NOIP 2014 D2T3 解方程 Hash大法好
题目大意:给定高次方程an*x^n+...+a1*x^1+a0*x^0=0 求[1,m]区间内有多少个整数根 ai<=10^10000.m<=100W 懒得高精,考场上写的long dou ...
- HDU5183 hash 表
做题的时候忘了 数据结构老师说的hash表了, 用二分找,还好过了, hash 表 对这题 更快一些 #include <iostream> #include <algorithm& ...
- LeetCodeTwo Sum IV 树的遍历+Hash大法好
题意 给定一颗二叉搜索树,返回是否存在两个节点的值之和为给定值K. 思路 同Two Sum.使用Hash表解决.只是要写个树的遍历而已,选取DFS. 源码 class Solution { publi ...
- POJ 1743 Musical Theme Hash+二分法
标题效果:有一个美丽的旋律,它们是由一些不大于88音调.如果计为五个音调的量度,问:是否有相同的节奏的多个部分(相同的差,以及两者之间的相同的节奏不能重叠),并寻求最长长度. 思考:这个问题是八人中的 ...
- 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列
hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...
- LeetCode longest substring without repeating characters 题解 Hash表
题目 Given a string, find the length of the longest substring without repeating characters. Example 1: ...
- 【Tyvj 1060】【NOIP 2005】等价表达式
设a为一个质数,模数为另一个质数,然后暴力算多项式的答案,如果答案相等就认为两个多项式相等. 这种hash有出错概率的题为什么还是要用hash呢?因为出错的概率实在太小了,a和模数的值取得好出题人根本 ...
- bzoj4264: 小C找朋友
hash大法好 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...
随机推荐
- java:如何用代码控制H2 Database启动
1.纯手动start/stop package com.cnblogs.yjmyzz.h2; import java.sql.Connection; import java.sql.DriverMan ...
- 如何在前台脚本通过json传递数据到后台(使用微软自带的ajax)
首先,我们要在前台引入json的脚本,以便于把js对象序列化 <script type="text/javascript" src="/js/jquery.json ...
- Python2.3-原理之语句和语法
此节来自于<Python学习手册第四版>第三部分 一.python语句简介(第10章) 1.首先记得一个概念:a.程序由模块构成:b.模块包含语句:c.语句包含表达式:d.表达式建立并处理 ...
- css3实践之图片轮播(Transform,Transition和Animation)
楼主喜欢追求视觉上的享受,虽常以牺牲性能无法兼容为代价却也乐此不疲.本文就通过一个个的demo演示来简单了解下css3下的Transform,Transition和Animation. 本文需要实现效 ...
- 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&界面管理)
继上一次介绍了<神奇的六边形>的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏<跳跃的方块>的完整开发流程. (点击图片可进入游戏体验) 因内容太多,为 ...
- NPOI导出
<body> @using (Html.BeginForm("ImportCommentsFile", "CommentsManage", Form ...
- DNS资源纪录(Resource Record)介绍
http://dns-learning.twnic.net.tw/bind/intro6.html 类型 SOA NS A AAAA PTR CNAME MX -------------- ...
- hiho一下 第六十四周 Right-click Context Menu
题目链接:hihocoder 第64周 题意概述: 上下文菜单是panel(面板)包括很多section(分区),一个分区里面至少包含一个菜单项.每一个菜单项都对应有一个子panel,这个panel可 ...
- Mybatis——oracle 的模糊查询 和 日期处理
第一种 1 <if test="AGTNAM !=null and AGTNAM !=''"> <![CDATA[and AGTNAM like concat(c ...
- Entity Framework Code First (七)空间数据类型 Spatial Data Types
声明:本文针对 EF5+, Visual Studio 2012+ 空间数据类型(Spatial Data Types)是在 EF5 中引入的,空间数据类型表现有两种: Geography (地理学上 ...