hdu 3530 单调队列最值
/**
HDU 3530 单调队列的应用
题意:
给定一段序列,求出最长的一段子序列使得该子序列中最大最小只差x满足m<=x<=k。
解题思路:
建立两个单调队列分别递增和递减维护(头尾删除,只有尾可插入)
Max - Min 为两个队列的队首之差while(Max-Min>K) 看哪个的队首元素比较前就移动谁的
最后求长度时,需要先记录上一次的被淘汰的最值位置last ,这样[last+1,i]即为满足条件的连续子序列了
i - last
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=;
int q_max[N],q_min[N];//递增,递减
int a[N],n,m,k;
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
int head_min=,head_max=,tail_min=,tail_max=;
int left1=,left2=;
int maxx=;
for(int i=;i<=n;i++)
{
while(head_min<tail_min&&a[q_min[tail_min-]]<=a[i])
tail_min--;
while(head_max<tail_max&&a[q_max[tail_max-]]>=a[i])
tail_max--;
q_max[tail_max++]=q_min[tail_min++]=i;
/* printf("***%d 递减、递增***\n",i);
for(int j=head_min;j<tail_min;j++)
printf("%d ",a[q_min[j]]);
printf("\n");
for(int j=head_max;j<tail_max;j++)
printf("%d ",a[q_max[j]]);
printf("\n");*/
while(a[q_min[head_min]]-a[q_max[head_max]]>k)
{
if(q_min[head_min]<q_max[head_max])
left1=q_min[head_min++];
else
left2=q_max[head_max++];
}
if(a[q_min[head_min]]-a[q_max[head_max]]>=m)
maxx=max(maxx,i-max(left1,left2));
}
printf("%d\n",maxx);
}
return ;
}
/*
5 2 3
1 -1 2 -6 5
5 1 3
1 2 3 4 5
6 0 0
-1 0 2 1 125 -5
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+;
int a[maxn], q1[maxn], q2[maxn];
int main()
{
int n, m, k;
while(cin>>n>>m>>k) {
for(int i = ; i<n; i++) {
scanf("%d", &a[i]);
}
int st1 = , st2 = , ed1 = , ed2 = , ans = , now = ;
for(int i = ; i<n; i++) {
while(st1<ed1&&a[q1[ed1-]]<a[i]) //q1维护一个单调递减的数列,这样队头元素是最大值, 第二个是第二大的值
ed1--;
while(st2<ed2&&a[q2[ed2-]]>a[i]) //q2维护一个单调递增的数列, 队头是最小值。
ed2--;
q1[ed1++] = q2[ed2++] = i;
while(st1<ed1&&st2<ed2&&a[q1[st1]]-a[q2[st2]]>k) { //如果最大值-最小值大于k
if(q1[st1]<q2[st2]) {
now = q1[st1++]+; //如果最大值在序列中的位置小于最小值
} else {
now = q2[st2++]+;
}
}
if(st1<ed1&&st2<ed2&&a[q1[st1]]-a[q2[st2]]>=m) {
ans = max(ans, i-now+); //只有最大值-最小值大于等于m的时候才更新ans
}
}
cout<<ans<<endl;
}
}
hdu 3530 单调队列最值的更多相关文章
- HDU 3530 单调队列
题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...
- HDU 3507 单调队列 斜率优化
斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- HDU 2191 - 单调队列优化多重背包
题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...
- hdu 3415(单调队列) Max Sum of Max-K-sub-sequence
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3415 大意是给出一个有n个数字的环状序列,让你求一个和最大的连续子序列.这个连续子序列的长度小于等于k. ...
- HDU 4122 单调队列
转载自:http://blog.csdn.net/lvshubao1314/article/details/46910271 DES :给出n个订单和m是商店的开放时间.然后n行给出n个订单的信息.然 ...
- hdu 3401 单调队列优化+dp
http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others) Memor ...
- hdu 3415 单调队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 5289(单调队列)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
随机推荐
- linux 简单命令说明
1.df -h 查看磁盘占用及挂载情况 挂载磁盘 如下: mount /dev/sda1 /boot 取消挂载的磁盘 umount /boot 2.dh -sh 查看当前目录占用文件大小 dh -sh ...
- 2、node-webkit运行web应用,node-webkit把web应用打包成桌面应用
下面我通过一个简单的demo来介绍怎么样把一个web应用打包成一个可执行文件(这里只介绍windows环境) 首先新建一个index.html文件,作为我们这个demo的入口页面,我们暂且就把这个页面 ...
- Windows10 家庭版安装 Docker Desktop
开启 Hyper-V 开启后会有提示让重启电脑,重启就 OK :: 创建cmd (echo pushd "%~dp0" echo dir /b %SystemRoot%\servi ...
- EDM邮件营销真的落伍了吗?
很多朋友都觉得EDM邮件营销已经日暮西山了.难道EDM邮件营销真的落伍过时了吗?小编本文为大家讲解一下. 一.有数据为证:目前电子邮件仍然比较活跃,九成以上的用户每天至少查看一封邮件,并且6成以上的人 ...
- redis 管理工具
1.redis studio 2.redis desktop manager
- Hibernate一级缓冲
Hibernate的一级缓冲 什么是缓冲 缓冲概念: 数据存在数据库中,数据库本身就是一个文件系统,使用流的方式操作文件,但是文件中有很多的内容,用流的操作得效率就低. 解决办法: 把数据存在内存中, ...
- 【HANA系列】SAP HANA数据处理的理解与分析一
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA数据处理的理解与 ...
- 1.parrot os 3.5-----nmap-----katoolin--zenmap
源:https://www.youtube.com/watch?v=LpM1KooILRc&list=PLBf0hzazHTGOEuhPQSnq-Ej8jRyXxfYvl&index= ...
- 前端 CSS 盒子模型 边框 border属性
边框 border:边框的意思,描述盒子的边框 边框有三个要素: 粗细 线性样式 颜色 border: solid border特性 如果颜色不写,默认是黑色.如果粗细不写,不显示边框.如果只写线性样 ...
- [Git] 022 没有人是一座孤岛
0.回顾 [Git] 015 远程仓库篇 第二话 关联与推送 的 "2" 中介绍过 git remote git remote -v 与 "status" 不同 ...