【hash表】收集雪花

【哈希和哈希表】收集雪花

题目描述

不同的雪花往往有不同的形状。在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们。一共有n个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状。在收集的过程中,同学们不希望有重复的雪花。你可以从任意a时刻开始,在b时刻停止。a到b时刻中间的雪花也都将被收集。他们希望收集的雪花最多。

输入

第一行一个正整数n;第2行到第n+1行表示n个时刻雪花的形状。

输出

最多能收集雪花的数量。

样例输入

5
1 2 3 2 1

样例输出

3

提示

n≤1e6,xi≤1e9



【题解】

这个题目其实用的是一种的hash方式,其实就是我们常用的离散化操作。

1、另外一个数组存放相同数据,然后进行排序。

2、因为大小相同可以看成一个数,所以相同的话,可以用lower_bound来写,因为是大于等于某个数,等于可以看成对应的大小关系。

3、然后进行双指针方法来跑最大区间的不同种类的个数。



【代码】

 1 #include<cstdio>
 2 #include<bitset>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef unsigned long long ULL ;
 7 const int N = 1e6+10;
 8 const int M = 5e6+10;
 9 const ULL base = 131;
10 int a[N],c[N],H[M],n;
11 ULL b[N];
12 void Dispersed(){
13     sort( b + 1 , b + 1 + n );
14     for(int i=1;i<=n;i++){
15         c[i] = lower_bound(b+1,b+1+n,a[i]) - (b+1);
16     }
17 }
18 int main()
19 {
20     ios_base :: sync_with_stdio(false);
21     cin.tie(NULL) , cout.tie(NULL) ;
22
23     cin >> n ;
24     for(int i=1;i<=n;i++)   cin >> a[i] ,b[i] = a[i];
25     Dispersed();
26
27     int res = 0 ;
28     for(int i=1,j=1;j<=n;j++){
29         H[ c[j] ] ++ ;
30         while( H[c[j]] > 1 ) H[ c[i++] ] --;
31         res = max( res , j-i+1) ;
32     }
33     printf("%d\n",res );
34     return 0;
35 }

原文地址:https://www.cnblogs.com/Osea/p/11333474.html

时间: 2024-10-16 20:55:30

【hash表】收集雪花的相关文章

表收集错误导致执行计划错误

有时候,表收集信息错误,导致执行计划错误问题. SQL> insert into test values(1,'user1'); 已创建 1 行. SQL> commit; 提交完成. SQL> select * from test; ID NAME ---------- ---------------------------------------- 1 user1 SQL> insert into test values(2,'user2'); 已创建 1 行. SQL>

十一、从头到尾彻底解析Hash 表算法

在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法.----------------------------------

从头到尾彻底解析Hash 表算法

在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash表算法.----------------------------------

POJ3349: Snowflake Snow Snowflakes(hash 表)

考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总用时为O(n). hash的本质是把值映射到地址或者下标,如果不同的key值对应到相同的indice上的话,就需要进行chaining处理,吧indice指向一个链表,链表的每一个节点存储共享同一indice的不同key值. 因此问题的核心变成:吧相等的雪花映射到相同的indice上.这里雪花是一个

Hash表的表大小

hash表的出现主要是为了对内存中数据的快速.随机的访问.它主要有三个关键点:Hash表的大小.Hash函数.冲突的解决. 这里首先谈谈第一点:Hash表的大小. Hash表的大小一般是定长的,如果太大,则浪费空间,如果太小,冲突发生的概率变大,体现不出效率.所以,选择合适的Hash表的大小是Hash表性能的关键. 对于Hash表大小的选择通常会考虑两点: 第一,确保Hash表的大小是一个素数.常识告诉我们,当除以一个素数时,会产生最分散的余数,可能最糟糕的除法是除以2的倍数,因为这只会屏蔽被除

南阳OJ-138 找球号(二)(hash表应用)

找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,还有一个空箱子,现在有两种动作:一种是"ADD",表示向空箱子里放m(0<m<=100)个球,另一种是"QUERY",表示说出M(0<M<=100)个随机整数ki(0<=ki<=100000100),分

python 字典有序无序及查找效率,hash表

刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字典在python内部是通过哈希表的顺序来排的,做了一些测试,比如di = {1:1,3:3,2:2,4:4,5:5} ,无论怎么改变键值对的顺序,print di 总是会{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}.所以看起来当插入di['key']='value'时,这组键值对有时

hash表总结

Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找.这个源于Hash表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找. 1.Hash表的设计思想 对于一般的线性表,比如链表,如果要存储联系人信息: 张三 13980593357 李四 15828662334 王五 13409821234 张

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 结构体,而里面放了这个表所用的数组以及相应操作