码迷,mamicode.com
首页 > 其他好文 > 详细

【hash表】收集雪花

时间:2019-08-11 00:22:37      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:nbsp   双指针   sig   code   alt   最大   als   int   bsp   

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

题目描述

不同的雪花往往有不同的形状。在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们。一共有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 }
View Code

 

 

 

【hash表】收集雪花

标签:nbsp   双指针   sig   code   alt   最大   als   int   bsp   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!