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
原创粉丝点击