hdu5183Negative and Positive (NP))——手写Hash&&模板
题意:问是否存在一段区间其加减交错和为K。
显然,我们可以用set保存前缀和,然后枚举一个端点查找。具体的
若在st1中查找 $t$,为 $sum-t=-k$,在st2中则是 $sum-t=k$。
注意这样作差的话,没有考虑到 $a_1$ 开始的,只要在st2中插入一个0即可。
然而,这题卡set,必须手写hashmap(说实话,之前不太相信会有卡set的题!)
后来发现unordered_set也能过(刚好过)
分别是unordered_set、set、手写hashmap
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = + ;
int n, k;
//set<ll>st1, st2; const unsigned long long SMod = ;
struct Hashmap
{
struct Node
{
long long num;
int next;
};
Node nodes[*maxn];
int cnt_node; //节点个数
int head[SMod+]; //链表的头 void init()
{
memset(head, - , sizeof(head));
cnt_node = ;
} void insert(long long num)
{
int pos = num % SMod; //在链表头中的位置
nodes[cnt_node].next = head[pos];
nodes[cnt_node].num = num;
head[pos] = cnt_node;
cnt_node++;
} long long find(long long num) //找到的话返回节点编号,没找到返回-1
{
int pos = num % SMod;
for(int i = head[pos]; i != -; i = nodes[i].next)
{
if(nodes[i].num == num) return i;
}
return -;
}
}st1, st2; int main()
{
int T, kase=;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &k);
ll sum = ;
bool flag = false;
st1.init(); st2.init(); st2.insert();
for(int i = ;i <= n;i++)
{
int tmp;
scanf("%d", &tmp);
if(i&){ sum += tmp; st1.insert(sum);}
else { sum -= tmp; st2.insert(sum);} //printf("sum:%d\n", sum);
if(st1.find(sum+k) != -|| st2.find(sum-k) != -) flag = true;
} printf("Case #%d: ", ++kase);
if(flag) printf("Yes.\n");
else printf("No.\n");
}
}
hdu5183Negative and Positive (NP))——手写Hash&&模板的更多相关文章
- HDU 5183 Negative and Positive (NP) (手写哈希)
题目链接:HDU 5183 Problem Description When given an array \((a_0,a_1,a_2,⋯a_{n−1})\) and an integer \(K\ ...
- HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)
根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: #include <stdio.h> #include <algorithm> #in ...
- dfs手写栈模板
在竞赛中如果系统栈很小的话,过深的递归会让栈溢出,这个时候我们就要自己手写栈,将递归转化成手工栈. 方法其实也很简单. 基本思路上,我们就是用栈不断的pop,push.但是何时push,何时pop呢? ...
- 2019牛客多校第五场generator2——BSGS&&手写Hash
题目 几乎原题 BZOJ3122题解 分析 先推一波公式,然后除去特殊情况分类讨论,剩下就是形如 $a^i \equiv b(mod \ p)$ 的方程,可以使用BSGS算法. 在标准的BSGS中,内 ...
- hdu-5183-Negative and Positive (NP)(hash模板)
题目链接 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...
- Vue2.0 + ElementUI 手写权限管理系统后台模板(一)——简述
挤一下: 一开始以为没有多少人用就没建群,但是加我的人太多了,好多问题都是重复的,所以建个群大家互相沟通交流方便点,但是建的有点晚,错过了好多人所以群里人有点少,QQ群: 157216616 小提示 ...
- Tensorflow搭建卷积神经网络识别手写英语字母
更新记录: 2018年2月5日 初始文章版本 近几天需要进行英语手写体识别,查阅了很多资料,但是大多数资料都是针对MNIST数据集的,并且主要识别手写数字.为了满足实际的英文手写识别需求,需要从训练集 ...
- 第三节,TensorFlow 使用CNN实现手写数字识别(卷积函数tf.nn.convd介绍)
上一节,我们已经讲解了使用全连接网络实现手写数字识别,其正确率大概能达到98%,这一节我们使用卷积神经网络来实现手写数字识别, 其准确率可以超过99%,程序主要包括以下几块内容 [1]: 导入数据,即 ...
- C基础 带你手写 redis adlist 双向链表
引言 - 导航栏目 有些朋友可能对 redis 充满着数不尽的求知欲, 也许是 redis 属于工作, 交流(面试)的大头戏, 不得不 ... 而自己当下对于 redis 只是停留在会用层面, 细节层 ...
随机推荐
- WCF-初识DEMO
类库 System.ServiceModle WCF类库 契约IUser1,实现User1 [ServiceContract] public interface IUser1 { [Operation ...
- mysql只会使用到一个索引的原因
select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar' 其中column1,colu ...
- Linux下使用Vim粘贴文本错乱问题解决
在使用vim进行文档操作时,经常需要进行复制粘贴,在粘贴大量代码时,出现行错位等各种错乱,查找问题解决办法: vim进入文件后,先ESC 在出入 :set paste 回车后再按下 i 之后进行粘 ...
- LC 206. Reverse Linked List
题目描述 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5-> ...
- laravle6.0-IOC-DI浅谈
1.什么是IOC,DI IOC(Inversion of Control)控制反转:ioc意味着,你将自己设计好的对象交给容器来控制,而不是传统的在你的对象内部直接控制.比如: 人 操控 手机 做一些 ...
- Redis主从及Cluster区别及注意事项
https://yq.aliyun.com/articles/647342 https://blog.csdn.net/biren_wang/article/details/78117392 http ...
- 『Python基础』第2节: Python简介及入门
一. Python介绍 Python是一门高级计算机程序设计语言,1989年,荷兰的Guido von Rossum创造了它.Guido是是一个牛人,1982年,他从阿姆斯特丹大学获得了数学和计算机硕 ...
- Django——关于项目开发遇到的一些小技巧
目录 头像图片 js获取网站信息 js获取前端信息 Dj获取刚写入的数据的信息 js跳转新链接 头像图片对象的显示 在做到根据登陆ID决定用户头像的时候,加载静态文件的{% static ‘xxxxx ...
- C# DateTime Subtract
DateTime start = DateTime.Now.AddDays(-20); DateTime end = DateTime.Now; TimeSpan ts = end.Subtract( ...
- C++新特性---智能指针
智能指针: 为什么需要智能指针? 1. malloc出来的空间,没有进行释放,存在内存泄漏的问题. 2. 异常安全问题.如果在malloc和free之间如果存 ...