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 ...
随机推荐
- Python-Django WebAPi基本使用方法
目的 利用django搭建一个WebApi,实现数据库表的增删查改. 数据传输基于Http协议,数据格式:JSON ORM方式进行数据库表的CRUD(增删查改) 开发步骤 使用pycharm专业版搭建 ...
- How jQuery UI Works
https://learn.jquery.com/jquery-ui/how-jquery-ui-works/ jQuery UI contains many widgets that maintai ...
- html上传文件
不太懂Html 做备用 html的文件上传分两个 第一个是Html文件 浏览器加载用的 另一个是PHP文件 处理上传文件的 下面是Html文件 叫index.html <html> < ...
- 类Enum
int compareTo(E o) 比较此枚举与指定对象的顺序. String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明. int ordinal() 返回枚举常量的序数(它在 ...
- Intellij IDEA 常见问题
右击项目时,没有 Java Class,只能创建其他文件 IDEA 还没有将这个项目识别为 Maven 项目时,会出现这种情况.此时右键无法创建类. 解决办法: 手动为 IDEA 指定项目类型:如果编 ...
- 判断Ctrl Shift Alt 键当前是否被按下
Control.ModifierKeys.HasFlag(Keys.Shift) 以此类推
- TCP的三次握手过程
TCP::传输控制协议(Transmission Control Protocol ) 是一种面相连接的.可靠的.基于字节流的 传输层通信协议. TCP是一种面相连接的协议.其显著的特点就是在 ...
- Python3 多线程编程 threading模块
性能自动化测试除了用jmeter还可以用python threading模块做 一.threading模块定义 Python 2.4中包含的较新的线程模块为线程提供了更强大的高级支持. 线程模块公开线 ...
- mysql中关于 like ,not like 的用法时不能显示空值的数据(空值不参与判断,直接过滤空值)
一般在项目中用法是(这种没办法显示空值的数据): select * from 表 where 字段 like %aaa%; 解决空值不显示(除了显示的数据外,空值数据也可以显示): select * ...
- Java类加载器总结网址
http://blog.csdn.net/gjanyanlig/article/details/6818655