找区间连续值(HDU5247)

时间:2022-09-03 15:20:16

找连续数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1033    Accepted Submission(s): 371

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
分析:找某个区间的一些列数是否连续,就看最大值-最小值+1==k且里面的数各不相同,前者可以用RMQ解决,后者需要预处理,枚举每个i向后搜索到j+1遇到前面已经出现过的数字,表示已经重复了,则[i,j]区间内的值一定是不重复的,用vis[i]=j来记录,表示区间[i,vis[i]]内的值都是不重复的,到时对于区间[L,R]首先RMQ求出最值maxi和mini,然后判断区间[i-k+1,i]是否在[i-k+1,vis[i-k+1]]内,num计数。
程序:
 #include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"algorithm"
#include"queue"
#include"math.h"
#include"iostream"
#include"vector"
#define M 10009
#define inf 0x3f3f3f3f
#define eps 1e-9
#define PI acos(-1.0)
#include"map"
#include"vector"
#include"set"
#include"string"
using namespace std;
int vis[];
int a[M];
int Log[M],dp_min[M][],dp_max[M][];
void init()
{
Log[] = -;
for(int i = ;i <M;i++)
Log[i] = ((i&(i-)) == )?Log[i-]+:Log[i-];
}
void RMQ(int n)
{
int i,j;
int m=Log[n];
for(i=;i<=n;i++)
dp_min[i][]=dp_max[i][]=a[i];//dis代表原数列
for(j=;j<=m;j++)
{
for(i=;i<=n+-(<<j);i++)
{
dp_max[i][j]=max(dp_max[i][j-],dp_max[i+(<<(j-))][j-]);
dp_min[i][j]=min(dp_min[i][j-],dp_min[i+(<<(j-))][j-]);
}
}
}
int lcp_min(int x,int y)
{
int m=Log[y-x+];
return min(dp_min[x][m],dp_min[y+-(<<m)][m]);
}
int lcp_max(int x,int y)
{
int m=Log[y-x+];
return max(dp_max[x][m],dp_max[y+-(<<m)][m]);
}
int main()
{ int kk=;
int n,m;
while(scanf("%d%d",&n,&m)!=-)
{ for(int i=;i<=n;i++)
scanf("%d",&a[i]);
init();
RMQ(n);
map<int,int>mp;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
{
mp[a[i]]=i;
vis[i]=i;
int j;
for(j=i+;j<=n;j++)
{
if(mp[a[j]]==)
{
mp[a[j]]=j;
vis[i]=j;
}
else
{
break;
}
}
if(j==n+)//小优化,如果区间[i,n]都不相同则[k,n]的所有区间也都不同(k>=i)
{
for(int j=i+;j<=n;j++)
vis[j]=n;
break;
}
for(int k=i;k<=j;k++)
mp[a[k]]=;
}
printf("Case #%d:\n",kk++);
while(m--)
{
int k;
scanf("%d",&k);
int num=;
if(k>n)
{
printf("0\n");
continue;
}
for(int i=k;i<=n;i++)
{
int maxi=lcp_max(i-k+,i);
int mini=lcp_min(i-k+,i);
if(maxi-mini==k-&&vis[i-k+]>=i)
num++;
}
printf("%d\n",num);
}
}
return ;
}
 

找区间连续值(HDU5247)的更多相关文章

  1. STL中区间最值max&lowbar;element和min&lowbar;element的用法

    前面的博客已经讲解了nth_element寻找区间第K大的用法,现在我们来说说这两个找区间最值的用法.两个函数都包含在algorithm库中. 一.函数原型 max_element template& ...

  2. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

  3. P1714切蛋糕&lpar;不定区间最值&rpar;

    题面 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但小Z最多又 ...

  4. ZOJ 2301 &sol; HDU 1199 Color the Ball 离散化&plus;线段树区间连续最大和

    题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...

  5. RAM区间最值

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...

  6. 【HDU】1754 I hate it ——线段树 单点更新 区间最值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. 【RMQ】 区间最值查询详解

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  8. &lbrack;leetcode&rsqb;34&period;Find First and Last Position of Element in Sorted Array找区间

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  9. hdu3183 rmq求区间最值的下标

    两个月前做的题,以后可以看看,是rmq关于求区间最值的下标 /* hdu3183 终点 给一个整数,可以删除m位,留下的数字形成一个新的整数 rmq 取n-m个数,使形成的数最小 */ #includ ...

随机推荐

  1. SpringMVC框架的基础知识;

    首先 在javaEE环境下,建立一个动态的web工程: 导入架包.... 建立一对多映射关系的封装类,这儿只写属性,getter和setter方法就不写了: 1: private String pro ...

  2. Linq专题之创建Linq查询表达式

    本节我们主要介绍一下如何创建查询集合类型,关系数据库类型,DataSet对象类型和XML类型的数据源的Linq查询表达式. 下面在实例代码ReadyCollectionData()函数创建了准备的数据 ...

  3. java笔记--枚举总结与详解

    由于工作原因,已经有两礼拜没有更新博客了,好不容易完成了工作项目,终于又可以在博客园上愉快的玩耍了. 嗯,今天下午梳理了一下关于java枚举的笔记,比较长,不过还是觉得挺厚实的,哈哈,有出入的地方,欢 ...

  4. c&num;部分---好题--顺便练练&OpenCurlyDoubleQuote;类的知识”

    练习:判断邮箱格式是否正确 //1.有且只能有一个@ //2.不能以@开头 //3.@之后至少有一个. //4.@和.不能靠在一起 //5.不能以.结尾

  5. PHP 中 const define 的区别

    在php中定义常量时,可用到const与define这两种方法,那他们到底有什么区别呢? 1.const用于类成员变量的定义,一经定义,不可修改.define不可用于类成员变量的定义,可用于全局常量. ...

  6. Unity-Shader-动态阴影&lpar;上&rpar; 投影的矩阵变换过程

    [旧博客转移 - 2017年1月20日 01:20 ] 前面的话 最近很长时间没写博文了,一是太忙 ( lan ) 了,二是这段时间又领悟了一些东西,脑子里很混乱,不知道从何写起.但感觉不能再拖延下去 ...

  7. 详解Android Activity---启动模式

    相关的基本概念: 1.任务栈(Task)   若干个Activity的集合的栈表示一个Task.   栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...

  8. 安利一个神器:Tmux

    对于程序员来说,一个好用且高效的软件工具就如同加持了神技的游戏角色.下面就给大家介绍一个神器 Tmux 以及个人的使用总结. 一.我所认识的 Tmux 在工作中,我把 tmux 当作终端会话管理器来使 ...

  9. Android利用RecyclerView实现列表倒计时效果

    最近面试时,面试官问了一个列表倒计时效果如何实现,然后脑袋突然懵的了O(∩_∩)O,现在记录一下. 运行效果图 实现思路 实现方法主要有两个: 1.为每个开始倒计时的item启动一个定时器,再做更新i ...

  10. 用TTTAttributedLabel创建变化丰富的UILabel

    转自:http://blog.csdn.net/prevention/article/details/9998575 1. 不同颜色的字段混合在一个Label里怎么实现? 看TTTAttributed ...