找区间连续值(HDU5247)
找连续数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1033 Accepted Submission(s): 371
现在小度熊增加题目难度,他不想知道是否有这样的 k 的区间,而是想知道有几个这样的 k 的区间。
第一行包含两个整数n,m,n代表数组中有多少个数字,m 代表针对于此数组的询问次数,n不会超过10的4次方,m 不会超过1000。第二行包含n个正整数,第 I 个数字代表无序数组的第 I 位上的数字,数字大小不会超过2的31次方。接下来 m 行,每行一个正整数 k,含义详见题目描述,k 的大小不会超过1000。
然后对于每个询问的 k,输出一行包含一个整数,代表数组中满足条件的 k 的大小的区间的数量。
#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)的更多相关文章
- STL中区间最值max_element和min_element的用法
前面的博客已经讲解了nth_element寻找区间第K大的用法,现在我们来说说这两个找区间最值的用法.两个函数都包含在algorithm库中. 一.函数原型 max_element template& ...
- FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解
题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...
- P1714切蛋糕(不定区间最值)
题面 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但小Z最多又 ...
- ZOJ 2301 / HDU 1199 Color the Ball 离散化+线段树区间连续最大和
题意:给你n个球排成一行,初始都为黑色,现在给一些操作(L,R,color),给[L,R]区间内的求染上颜色color,'w'为白,'b'为黑.问最后最长的白色区间的起点和终点的位置. 解法:先离散化 ...
- RAM区间最值
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...
- 【HDU】1754 I hate it ——线段树 单点更新 区间最值
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 【RMQ】 区间最值查询详解
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...
- [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 ...
- hdu3183 rmq求区间最值的下标
两个月前做的题,以后可以看看,是rmq关于求区间最值的下标 /* hdu3183 终点 给一个整数,可以删除m位,留下的数字形成一个新的整数 rmq 取n-m个数,使形成的数最小 */ #includ ...
随机推荐
- P1379 八数码问题
aoapc上的八数码问题,在luogu上也有类似的题,p1379,经典题目,lrj给出了一个算法,同时给出了三种判重的方法.本来想用std::queue改写一下,但是出了各种问题,只好抄代码ac掉这道 ...
- h5在线状态监测
一个属性,2个事件 navigator.onLine 表示当前浏览器的的在线状态. window.addEventListener("online", function(){}); ...
- php数据缓存
用php进行微信开发时,碰到access_token长久保存的问题,以前都是用框架里的Cache直接set.get一下就完了.现在没框架可用了,只好自己动手写一个cache暂时用. 这个Cache类用 ...
- 【转】最简单的CI框架入门示例--数据库取数据
1.下载CI框架(自己找) 2.配置 database.php配置: 为数据库服务器设置 connection 参数: $db['default']['hostname'] = "yo ...
- XMLHttpRequest函数
function createXmlHttpRequest(){ if(window.ActiveXObject){ return new ActiveXObject("Microsoft. ...
- 深入了解Windows句柄到底是什么
深入了解Windows句柄到底是什么 http://blog.csdn.net/wenzhou1219/article/details/17659485 总是有新入门的Windows程序员问我Wind ...
- A2DP协议笔记
1.概述 A2DP(Advanced Audio Distribution Profile)是蓝牙的音频传输协议,典型应用为蓝牙耳机.A2DP协议的音频数据在ACL Link上传输,这与SCO ...
- BLE 4.0 与 4.1的区别
蓝牙技术让我们在连接各种设备的时候不再被繁多的数据线所束缚,比如音响.电脑,甚至是汽车.目前最新的蓝牙版本是4.0,相比3.0它进一步降低了功耗,并且也提高了传输效率.近日,蓝牙技术联盟(Blueto ...
- JavaScript判断文件的大小
function getFileSize(obj) {//obj 需要传入的参数为Input的对象 var objValue = obj.value; if (objValue == " ...
- Bulk Insert & BCP执行效率对比(续)
上回由于磁盘空间(约70G)不足,导致Bulk Insert和BCP导入中途失败:今次统一一些操作,以得到Bulk insert与BCP分别执行效率: 1. 15435390笔数据,21.7G csv ...