首页 > 其他 > 详细

单调队列 滑动窗口模型

时间:2019-06-22 16:18:25      阅读:171      评论:0      收藏:0      [点我收藏+]

 

作用:快速取出[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]<<" ";
}
	}

单调队列 滑动窗口模型

原文:https://www.cnblogs.com/OIEREDSION/p/11069198.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!