hdu 5183 hash表
BC # 32 1002
题意:给出一个数组 a 和一个数 K ,问是否存在数对( i , j ),使 a i - a i + 1 +……+ (-1)j - i a j ;
对于这道题,一开始就想到了是前缀和,但是如果只是记录下前缀和数组,那么查找就会成为一个大问题。补题的时候一开始考虑用 hash 数组或者是 set 存,但是很明显 TLE 了,在翔神的推荐下,我研究了一下 hash表的创建过程,惊奇地发现,其实就是建了一个 HashMap 结构体,而里面放了这个表所用的数组以及相应操作的函数。其中创建 HashMap 就是将表的大小(size)定为0,然后将所有值所指的头定为 -1 ,插入数值操作完全和创建链式前向星一样,只是只有一条链而链式前向星有多个点的多条链而已,而查找 Hash 值也是和链式前向星的遍历一样。
#include<stdio.h>
#include<string.h>
#define ll long long const int MAXM=;
ll a[MAXM]; ll read(){
ll f=,x=;
char c=getchar();
while(c>''||c<''){
if(c=='-')f=-;
c=getchar();
}
while(c<=''&&c>=''){
x=x*+c-'';
c=getchar();
}
return x*f;
} struct HashMap{
int next[MAXM],head[MAXM],size;
ll state[MAXM];
void init(){
size=;
memset(head,-,sizeof(head));
}
bool check(ll val){
int h=(val%MAXM+MAXM)%MAXM;
for(int i=head[h];~i;i=next[i]){
if(state[i]==val)return ;
}
return ;
}
bool insert(ll val){
int h=(val%MAXM+MAXM)%MAXM;
for(int i=head[h];~i;i=next[i]){
if(state[i]==val)return ;
}
state[size]=val;
next[size]=head[h];
head[h]=size++;
return ;
}
}H1,H2; int main(){
int T;
while(scanf("%d",&T)!=EOF){
for(int q=;q<=T;q++){
H1.init();
H1.insert();
H2.init();
// H2.insert(0);
int n,k;
n=read();
k=read();
int i;
ll s=;
bool f=;
for(i=;i<n;i++) a[i]=read();
for(i=;i<n&&!f;i++){
if(i&){
s-=a[i];/*
if(H1.check(s-k)){
f=1;
}
H1.insert(s);*/
}
else{
s+=a[i];/*
if(H2.check(-s-k)){
f=1;
}
H2.insert(-s);*/
}
if(H1.check(s-k)||H2.check(-s-k))f=;
if(i&){
H1.insert(s);
}
else H2.insert(-s);
}
if(f)printf("Case #%d: Yes.\n",q);
else printf("Case #%d: No.\n",q);
}
}
return ;
}
hdu 5183 hash表的更多相关文章
- hdu 5183(Hash处理区间问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2+a3-a4+.....+/-an 中是否 ...
- hdu 5183
hdu 5183(Hash处理区间问题) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意:给出一个n个元素的数组,现在要求判断 a1-a2 ...
- HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)
根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: #include <stdio.h> #include <algorithm> #in ...
- hdu 1496 Equations hash表
hdu 1496 Equations hash表 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1496 思路: hash表,将原来\(n^{4}\)降 ...
- 结构体:HASH表模板
这种 HASHMAP 就是一个链式前向星的表: 其中: init 函数:hashmap 创建初始化: check 函数:寻找 hash 表中是否有需要查找的值,若有则返回 1 ,否则返回 0 :遍历方 ...
- HDU 5183 Negative and Positive (NP) 前缀和+哈希
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5183 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- HDU 6046 - hash | 2017 Multi-University Training Contest 2
思路来自题解和一些博客 最麻烦的是样例没啥用- - /* HDU 6046 - hash [ hash,鸽巢 ] | 2017 Multi-University Training Contest 2 ...
- hash表长度优化证明
hash表冲突的解决方法一般有两个方向: 一个是倾向于空间换时间,使用向量加链表可以最大程度的在节省空间的前提下解决冲突. 另外一个倾向于时间换空间,下面是关于这种思路的一种合适表长度的证明过程: 这 ...
- 6.数组和Hash表
当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Object类型,使用-i ...
随机推荐
- Android scrollview和GridView混合使用
在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便会出问题,即GridView会显示不全.解决办法,自定义一个GridView控件 p ...
- Linux后台日志定时清理脚本
一. 简介 linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否 ...
- 雷林鹏分享:C# 正则表达式
C# 正则表达式 正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 定义正则表达式 下面列出了用于定义正则表达式的各种类 ...
- 手把手教你开发jquery插件(三)
First, i want to add options to Tabs constructor like this: var tabs = $("div.tabs").tabs( ...
- 解决jenkins运行selenium测试出错的问题
If you run Jenkins as a service in the background it won't open apps in the foreground. You may eith ...
- python-day7-数字类型的内置方法
#=====>part1:数字类型#掌握:int,float#了解:Long(在python2中才有),complex# num=10# num=int(10)# print(type(num) ...
- svn拒绝连接
svn 服务开启: svnserve -d -r /home/svn
- OC 继承
一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). 在这里动物是猫类和 ...
- nginx支持返回相对路径
一.问题:http://192.168.72.4/bm-crm/ 局域网可以访问[实际指向了192.168.80.1:8081/brm-crm] http://59.41.111.24:8280/b ...
- 获取URL中的链接(可中文也可英文)
//既能获取中文url也能英文function getUrlParam(key) { // 获取参数 var url = window.location.search; // 正则筛选地址栏 var ...