HDU3530

题意:求区间内最大值和最小值的差值在m和k之间的子区间的最大长度

题解:单调队列维护一个单增队列和一个单减队列,last代表当前的区间最小的合法下标

           在维护单调队列过程,如果维护的区间内的最大值和最小值的差

#include 
#include 
#include 
#include 
#define MAX 100005
using namespace std ;
int num[MAX] ;
deque  maxque ;
deque  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()=a)
			{
				ans = max(ans , i - last) ;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

值大于k,则将下标靠前的不合法元素弹出,这样才能保证以后再加元素还是合法序列


你可能感兴趣的:(HDU)