P1886 滑动窗口 /【模板】单调队列 set的应用题解


P1886 滑动窗口 /【模板】单调队列


//60分 
#include
using namespace std;
vector  Maxv,Minv;
struct Maxnode
{
	int val;
	int i;
	bool operator <(const Maxnode &n)const
	{
		if (val>n.val)
		   return true;
		else
		   return i Maxset;
int main()
{
	int n,k;
	Maxnode Mx;
	set::iterator Mxit,Miit;
	scanf("%d %d",&n,&k);
	for (int i=1;i<=k;i++)
	{
		int x;
		scanf("%d",&x);
		Mx.val=x;
		Mx.i=i;
		Maxset.insert(Mx);
	}
	for (int i=k+1;i<=n;i++)
	{
		int x;
		Mxit=Maxset.begin();
		while(i-(Mxit->i)>k) 
		{
			Maxset.erase(Mxit);
			Mxit=Maxset.begin();	
		}
		Maxv.push_back(Mxit->val);
		Miit=Maxset.end();
		Miit--;
		while(i-(Miit->i)>k) 
		{
			Maxset.erase(Miit);
			Miit=Maxset.end();
			Miit--;	
		}
		Minv.push_back(Miit->val);
		scanf("%d",&x);
		Mx.val=x;
		Mx.i=i;
		Maxset.insert(Mx);
	}
	Mxit=Maxset.begin();
	while(n+1-(Mxit->i)>k) 
	{
		Maxset.erase(Mxit);
		Mxit=Maxset.begin();	
	}
	Maxv.push_back(Mxit->val);
	Miit=Maxset.end();
	Miit--;
	while(n+1-(Miit->i)>k) 
	{
		Maxset.erase(Miit);
		Miit=Maxset.end();	
		Miit--;
	}
	Minv.push_back(Miit->val);
	for (int i=0;i
						  
					  

相关