/**
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 单调队列最值的更多相关文章

  1. HDU 3530 单调队列

    题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...

  2. HDU 3507 单调队列 斜率优化

    斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...

  3. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  4. HDU 2191 - 单调队列优化多重背包

    题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...

  5. hdu 3415(单调队列) Max Sum of Max-K-sub-sequence

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3415 大意是给出一个有n个数字的环状序列,让你求一个和最大的连续子序列.这个连续子序列的长度小于等于k. ...

  6. HDU 4122 单调队列

    转载自:http://blog.csdn.net/lvshubao1314/article/details/46910271 DES :给出n个订单和m是商店的开放时间.然后n行给出n个订单的信息.然 ...

  7. hdu 3401 单调队列优化+dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  8. hdu 3415 单调队列

    Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  9. hdu 5289(单调队列)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

随机推荐

  1. spring session 加载的时候一些配置问题

    启动springboot时候的错误信息: An attempt was made to call the method org.springframework.boot.autoconfigure.s ...

  2. python常用笔记

    A trick when you want to flatten a matrix X of shape (a,b,c,d) to a matrix X_flatten of shape (b*c*d ...

  3. sqlite的系统表sqlite_master

      SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引.每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 它定义数据 ...

  4. http://www.malware-traffic-analysis.net/2018/index.html

    http://www.malware-traffic-analysis.net/2018/index.html

  5. ssm的自动类型转换器

    1.jsp页面将String 转换成employee类型 <form action="testConversionServiceConverer" method=" ...

  6. gunicorn+nginx配置方法

    对于gunicorn+nginx的配置,理解他们之间的关系很重要,以及最后如何确认配置结果是正确的也很重要 nginx 配置文件: 修改这个配置文件有3个用处: 假设服务器本身的Ip是A称为ip-A, ...

  7. Octavia 创建 loadbalancer 的实现与分析

    目录 文章目录 目录 从 Octavia API 看起 Octavia Controller Worker database_tasks.MapLoadbalancerToAmphora comput ...

  8. webpack中的 chunk,module,bundle的区别,以及hidden modules是什么

    hidden modules是什么: chunk,module,bundle的区别 总结: module是指任意的文件模块,等价于commonjs中的模块 chunks是webpack处理过程中被分组 ...

  9. delphi 进程通讯之WM_COPYDATA 发送程序(SendData.exe) 可用

    http://www.delphitop.com/html/wangluo/1529.html delphi 进程通讯之WM_COPYDATA 发送程序(SendData.exe) 作者:admin ...

  10. JavaScript —— 用法 输出

    用法 必须在<script>标签内 可以在<body>和<head>部分中 不限数量 <script> ... </script> 即可,不 ...