hdu5247 找连续数

Problem Description

小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的。

现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间。

Input

输入包含一组测试数据。

第一行包含两个整数n,m,n代表数组中有多少个数字,m 代表针对于此数组的询问次数,n不会超过10的4次方,m 不会超过1000。第二行包含n个正整数,第 I 个数字代表无序数组的第 I 位上的数字,数字大小不会超过2的31次方。接下来 m 行,每行一个正整数 k,含义详见题目描述,k 的大小不会超过1000。

Output

第一行输"Case #i:"。(由于只有一组样例,只输出”Case #1:”即可)

然后对于每个询问的 k,输出一行包含一个整数,代表数组中满足条件的 k 的大小的区间的数量。

Sample Input

6 2
3 2 1 4 3 5
3
4

Sample Output

Case #1:
2

2

这题因为询问有1000次,所以转化为离线操作,先把所有的询问储存起来并找到询问区间长度的最大值,然后枚举寻找的区间起点,对于每个起点寻找是不是有连续k个数循环的区间。找到的判断条件:1.区间所有数都不同。2.区间的最大值减去最小值加1的值为区间的长度。可以用map判断是否出现相同的数,如果出现可以直接跳出循环,因为后面更大的区间长度肯定不满足。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
int q[1006],a[100006],sum[1006];
int main()
{
	int n,m,i,j,num1=0,min1,max1,maxx;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		maxx=0;
		memset(sum,0,sizeof(sum)); //连续i个数的总区间个数
		for(i=1;i<=m;i++){
			scanf("%d",&q[i]);
			if(q[i]>maxx)maxx=q[i];
		}
		for(i=1;i<=n;i++){
            map<int,int>hash;
	        hash.clear();
	        min1=max1=a[i];
			for(j=1;j<=maxx && i+j-1<=n;j++){
				if(hash[a[i+j-1]]==0){
					hash[a[i+j-1]]++;
					if(min1>a[i+j-1])min1=a[i+j-1];
					else if(max1<a[i+j-1])max1=a[i+j-1];
					if(max1-min1+1==j)sum[j]++;
				}
				else break;
			}
		}
		num1++;
		printf("Case #%d:\n",num1);
		for(i=1;i<=m;i++){
			printf("%d\n",sum[q[i]]);
		}
	}
	return 0;
}

时间: 2024-10-01 10:39:39

hdu5247 找连续数的相关文章

HDU5247找连续数(百度之星初赛)

找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 677    Accepted Submission(s): 253 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这样的 k

2015年百度之星初赛(1) --- B 找连续数

找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 179    Accepted Submission(s): 65 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这样的 k 的区

百度之星 2015 初赛(1) 1002 找连续数

找连续数 Accepts: 401 Submissions: 1911 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间. Input

hdu 5247 找连续数(思维)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1207    Accepted Submission(s): 435 Problem Description 小度熊拿到了一个无序的数组,对于这个数组.小度熊想知道能否找到一

HDU 5247 找连续数 (set妙用)

找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1008    Accepted Submission(s): 362 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这样的 k

2015 百度之星 1002 找连续数 暴力

找连续数 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acdream.info/problem?pid=1751 Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间. Input 输入包含一组测试数据. 第一行包含两个整数n,m,n代表数组中有多少个数

HDU 5247 找连续数(RMQ+滑窗)

找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 281    Accepted Submission(s): 102 Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是否能找到一个k 的区间,里面的 k 个数字排完序后是连续的. 现在小度熊增加题目难度,他不想知道是否有这样的 k

编程之美第二题 找连续数

题意:   就是给你一个乱序序列,  现在要找某个特定序列的个数,   某特定序列的要求为  该序列长度为k   且序列中为连续的序列   例如 13245  就为1-5的连续序列 题解: 没啥解法   ,  两重for 暴力,就是这样 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<map> #include<string.h> using namesp

hdu 5247 找连续数【暴力枚举】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 分析:这道题是2015百度之星初赛1的2题,当时没看这道题 是队友看的,比完以后也做了一下,思路大体都是一样的,就是 暴力枚举,因为k<=1000,那么我们可以每一点x为起点跑[x,x+999] 这段区间,把每得到一段连续的子区间[x,?],则num[len]++(len=size([x,?])); 这样就可以了,最后num数组里就是对应的答案 献上代码: #include<stdio.h&