poj 2823 Sliding Window

单调队列的应用。

#include 
#include 
#include  
using namespace std;
#define max_n 1000005
#define inf 0x3f3f3f3f
deque m_min,m_max;
int data[max_n];
int n,k;
void getmax();
void getmin();
int main()
{
	scanf("%d%d",&n,&k);
	for(int i = 1;i<=n;i++)
	scanf("%d",&data[i]);
	getmin();
	getmax();
}
void getmin()
{
	data[0] =  inf;
	m_min.push_back(0);
	for(int i=1;i<=n;i++)
	{
		if(data[i]>=data[m_min.back()])
		{
			m_min.push_back(i);
		}
		else
		{
			do{
				m_min.pop_back();
			}while(!m_min.empty()&&data[m_min.back()]>data[i]);
			m_min.push_back(i);
		}
		if(i-m_min.front()+1>k)
		m_min.pop_front();
		if(i>=k)
		{
			printf("%d ",data[m_min.front()]);
		}
	}
	printf("\n"); 
}
void getmax()
{
	data[0] =  -inf;
	m_max.push_back(0);
	for(int i=1;i<=n;i++)
	{
		if(data[i]<=data[m_max.back()])
		{
			m_max.push_back(i);
		}
		else
		{
			do{
				m_max.pop_back();
			}while(!m_max.empty()&&data[m_max.back()]k)
		m_max.pop_front();
		if(i>=k)
		{
			printf("%d ",data[m_max.front()]);
		}
	}
	printf("\n"); 
}


你可能感兴趣的:(poj,单调队列)