单调队列
Posted sun123zxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单调队列相关的知识,希望对你有一定的参考价值。
废话不多说,上代码
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<ctime> #include<cstdlib> #include<queue> using namespace std; int maxsize;//维持的长度 int que[1000005];//单调队列 int data[1000005];//维护的数据 int head,tail; int n,m; int main() { //这里以维护 长度为m的区间中的最大值 为例 cin>>n>>m; head=0; tail=0; for(int i=1; i<=n; i++) { scanf("%d",&data[i]); } for(int i=1; i<=n; i++) { for(; head<tail;) { if(data[que[tail-1]]>data[i]) { break; } tail--; } que[tail]=i; tail++; if(que[head]+m<=i) { head++; } printf("%d ",data[que[head]]); } return 0; }
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<ctime> #include<cstdlib> #include<queue> using namespace std; struct MonoQue{ int maxsize;//维持的长度 int que[1000005];//单调队列 int data[1000005];//维护的数据 int head,tail; void init(){ head=0; tail=0; } void push(int id){//向单调队列中加入并维护 for(;head<tail;){ if(data[que[tail-1]]>data[id]){ break; } tail--; } que[tail]=id; tail++; if(que[head]+maxsize<=id){ pop(); } } void pop(){ head++; } int quetop(){ return que[head]; } int top(){ return data[quetop()]; } }a; int n,m; int main(){//这里以维护 长度为m的区间中的最大值 为例 cin>>n>>m; a.maxsize=m; a.init(); for(int i=1;i<=n;i++){ scanf("%d",&a.data[i]); } for(int i=1;i<=n;i++){ a.push(i); printf("%d ",a.top()); } return 0; }
模板题:洛谷P1886滑动窗口
以上是关于单调队列的主要内容,如果未能解决你的问题,请参考以下文章