HDU3530
来源:互联网 发布:淘宝官网首页 编辑:程序博客网 时间:2024/06/05 15:48
题意:求区间内最大值和最小值的差值在m和k之间的子区间的最大长度
题解:单调队列维护一个单增队列和一个单减队列,last代表当前的区间最小的合法下标
在维护单调队列过程,如果维护的区间内的最大值和最小值的差
#include <stdio.h>#include <iostream>#include <deque>#include <cmath>#define MAX 100005using namespace std ;int num[MAX] ;deque <int> maxque ;deque <int> minque ;int n , a , b ;int main(){while(~scanf("%d%d%d" , &n , &a , &b) ){for(int i = 0 ; i < n ; i ++) scanf("%d" , &num[i]) ;int ans = 0 ;while(!maxque.empty()) maxque.pop_front() ;while(!minque.empty()) minque.pop_front() ;int last = -1 ;for (int i = 0; i < n; ++i){while(!maxque.empty() && num[i] > num[maxque.back()])maxque.pop_back() ;while(!minque.empty() && num[i] < num[minque.back()])minque.pop_back() ;maxque.push_back(i) ;minque.push_back(i) ;if(!maxque.empty() &&!minque.empty()&& num[maxque.front()] - num[minque.front()] > b){if(maxque.front()>minque.front()){last = minque.front() ;minque.pop_front();}else if(maxque.front()<minque.front()){last = maxque.front() ;maxque.pop_front() ;}else{last = maxque.front();maxque.pop_front() ;minque.pop_front() ;}}if(!maxque.empty() && !minque.empty() &&num[maxque.front()] - num[minque.front()] >=a){ans = max(ans , i - last) ;}}printf("%d\n", ans);}return 0;}
值大于k,则将下标靠前的不合法元素弹出,这样才能保证以后再加元素还是合法序列
0 0
- HDU3530
- HDU3530
- HDU3530
- hdu3530 Subsequence
- hdu3530 Subsequence
- hdu3530 Subsequence
- hdu3530 Subsequence
- Subsequence hdu3530
- HDU3530-Subsequence
- hdu3530 Subsequence 单调队列
- hdu3530 Subsequence 单调队列
- hdu3530 Subsequence 单调队列
- hdu3530 Subsequence 单调队列
- hdu3530 Subsequence 单调队列
- hdu3530 Subsequence(单调队列)
- hdu3530单调队列
- HDU3530(单调队列)
- #HDU3530#Subsequence(单调队列)
- Solr 单机搭建 && Solr 集群搭建(集群交给Zookeeper管理)
- [算法学习笔记]排序算法——堆排序
- (4.6.17.4)进程保活(三:JNI层初探):单进程单向循环式启动服务
- 三角形相关重点
- 前端面试题---HTML部分
- HDU3530
- PHP -S 命令
- Servlet多线程同步问题及其解决方法
- Ubuntu16.04 ionic(jdk,sdk,gradle)环境搭建完全攻略
- Java基本环境介绍
- php超时处理全面总结
- Redis和Memcached的区别?
- Add Binary
- 单链表的建立