找连续数

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_element和min_element的用法

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

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

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

  3. P1714切蛋糕(不定区间最值)

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

  4. ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和

    题意:给你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. [leetcode]34.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. JAVA基础讲义

    一.安装JDK 第一步:双击JDK的exe文件. JDK(Java开发包),JRE(Java运行环境) 第二步:配置 path:jdk的根目录,jdk下的bin目录(两个目录之间记得用分号隔开) cl ...

  2. global.asax、global.asax.compiled、PrecompiledApp.config三者关系

    global.asax用WebDeploy发布后,会在bin下面产生一个global.asax.compiled,同时根目录下产生PrecompiledApp.config. 正常情况下global. ...

  3. VS小技巧

    1."清理解决方案":在对程序进行分发.上传时时常需要压缩解决方案文件夹,这时如果还嫌文件太大,可以在VS里右键解决方案---清理解决方.完成后,则该解决方案下的所有项目的将所有中 ...

  4. java JDK8 学习笔记——助教学习博客汇总

    java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...

  5. php--分享插件

    分享插件地址:   http://www.jiathis.com/

  6. (读书笔记)Asp.net Mvc 与WebForm 混合开发

    根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Webfo ...

  7. js数组到后台转 list数组

    前台的数组格式是: [{"credit_record_certificate_id":"452","credit_record_type": ...

  8. I Count Two Three---hdu5878(打表+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 题意:找到第一个>=n的数x, 满足 x = 2a3b5c7d:n<=1e9; 打表 ...

  9. CSS布局属性

    一.弹性盒模型介绍 1.弹性盒模型介绍 — 基础知识 弹性盒模型( Flexible Box 或 Flexbox)是一个CSS3新增布局模块,官方称为CSS Flexible Box Layout M ...

  10. iOS 调出storyboard里面起始Controller的箭头

    在storyboard里面,如果第一个ViewController不是默认的ViewController的时候,我们就需要拖拽一个出来. 如果把默认的ViewController删掉的话,前面的箭头, ...