找连续数

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. 【转】UML图中类之间的关系

    原文:http://blog.csdn.net/hguisu/article/details/7609483   类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相 ...

  2. su terminal get around---docker root

    su : must be run from a terminal After some googling, I found the solution from Tero's glob. If you ...

  3. php curl多线程抓取网页

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...

  4. C++ Primer Pluse_6_课后题

    #include <iostream> #include <cctype> #include <array> #include <string> #in ...

  5. 算法训练 A+B Problem

     算法训练 A+B Problem   时间限制:1.0s   内存限制:512.0MB      问题描述 输入A,B. 输出A+B. 输入格式 输入包含两个整数A,B,用一个空格分隔. 输出格式 ...

  6. jquery.autocomplete.js 两种实现方法

    <script type="text/javascript"> var v = 1; var stockInfoJson = [ { "name": ...

  7. [LeetCode]题解(python):088 Merge Sorted Array

    题目来源 https://leetcode.com/problems/merge-sorted-array/ Given two sorted integer arrays nums1 and num ...

  8. [LeetCode]题解(python):059-Spiral Matrix II

    题目来源 https://leetcode.com/problems/spiral-matrix-ii/ Given an integer n, generate a square matrix fi ...

  9. offset/client/scroll一些总结

    offset/client/scroll一些总结 1.offset 首先offset共有五个值 1.offsetParent 2.offsetTop 3.offsetLeft 4.offsetWidt ...

  10. logback的配置和使用

    1. logback介绍 logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback-classic和logback-acce ...