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 的区间,而是想知道有几个这样的 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

Source

2015年百度之星程序设计大赛
- 初赛(1)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247

题目分析:用set做,离线预处理满足条件的各长度区间数量,因为set自带排序,因此一旦一个不包含重复数字的连续区间里最大值减去最小值加一等于这个区间长度,那么这个区间就是我们要找的合法区间,记录下来

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
int const MAX = 1e4 + 5;
int a[MAX], ans[MAX];
set <int> s;

int main()
{
    int n, m, ca = 1;
    while(scanf("%d %d", &n, &m) != EOF)
    {
        printf("Case #%d:\n", ca ++);
        memset(ans, 0, sizeof(ans));
        for(int i = 0; i < n; i++)
            scanf("%d", &a[i]);
        for(int i = 0; i < n; i++)
        {
            s.clear();
            s.insert(a[i]);
            ans[1] ++;
            for(int j = i + 1; j < n; j++)
            {
                set <int> :: iterator it;
                it = s.find(a[j]);
                if(it != s.end())
                    break;
                s.insert(a[j]);
                int st = *s.begin();
                it --;
                int ed = *it;
                int sz = s.size();
                if(ed - st + 1 == sz)
                    ans[sz] ++;
            }
        }
        for(int i = 0; i < m; i++)
        {
            int k;
            scanf("%d", &k);
            printf("%d\n", ans[k]);
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 12:28:56

HDU 5247 找连续数 (set妙用)的相关文章

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 找连续数(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

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&

HDU ACM 5247 找连续数

分析:使用STL的set容器实现,set的内部排序默认是从小到达的.先把结果预处理到一个数组中存储起来,之后直接输出即可. #include<iostream> #include<set> using namespace std; #define N 10005 int a[N]; int ans[N]; set<int> s; //默认从小到达排序 set<int>::iterator it; int main() { int T=0; int n,m,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

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代表数组中有多少个数

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

编程之美第二题 找连续数

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