单调队列 滑动窗口模型

 

作用:快速取出[i,j]区间中的极值  

最大:单减

最小:单增

取队首

 

乱序中求极值

1. 二分(有序)

2.维护单调性   : 单调队列(有序)

 

 例题 nkoj 2152【单调队列】滑动窗口

 

时间限制 : 10000 MS   空间限制 : 65536 KB

// 
#include<bits/stdc++.h> 
using namespace std;
#define maxn  1000070 
struct node
{
	int num,id;
};
node mm[maxn];
int ans[1000070],ans1[1000070];
int main()
{	deque <node> Q;
	deque <node> K;
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
{	
	cin>>mm[i].num;
	mm[i].id=i;
}
K.push_back(mm[1]);
Q.push_back(mm[1]);
	for(int j=2;j<=n;j++)
	{
		while(Q.size()&&Q.back().num<=mm[j].num) Q.pop_back();
		Q.push_back(mm[j]);
		while(Q.front().id<=j-k) Q.pop_front();
		if(j>=k) ans[j]=Q.front().num;
	}
	for(int j=2;j<=n;j++)
	{
		while(K.size()&&K.back().num>=mm[j].num) K.pop_back();
		K.push_back(mm[j]);
		while(K.front().id<=j-k) K.pop_front();
		if(j>=k) ans1[j]=K.front().num;
	}
		for(int j=k;j<=n;j++)
{
	cout<<ans1[j]<<" ";
}cout<<endl;
	for(int j=k;j<=n;j++)
{
	cout<<ans[j]<<" ";
}
	}


多路合并问题:
nkoj 3765
构矩形
有序用堆+sum id 构造函数 选n个

posted @ 2019-06-22 16:05  ALEZ  阅读(343)  评论(0编辑  收藏  举报