POJ 2823
作者:互联网
单调队列
#include<iostream> #include<cstdio> using namespace std; const int MAXN=1000000+10; int n,k,maxh,minh,maxt,mint; int maxq[MAXN],minq[MAXN],num[MAXN];//maxq记录的是位置而不是大小、sum数组是不变的d int maxans[MAXN],minans[MAXN]; int main() { while (scanf("%d%d",&n,&k)!=EOF) { int maxhead=0,minhead=0,maxtail=0,mintail=0; for (int i=0;i<n;i++) { if (maxhead<maxtail && maxq[maxhead]<=i-k) //第一个是队列里还没有的 时候不执行 第二个是还没有达到k不执行 { maxhead++; //代表窗口向右移动一位置 } scanf("%d",&num[i]); while (maxhead<maxtail && num[maxq[maxtail-1]]<=num[i])//第一个上同,第二个是当前的数加入队列的时候该队列是不是单调递减的 { maxtail--; } maxq[maxtail]=i; maxtail++; maxans[i]=num[maxq[maxhead]]; } for (int i=k-1;i<n;i++) cout<<maxans[i]<<' ';cout<<endl; } return 0; }
标签:minh,EOF,int,maxq,MAXN,POJ,include,2823 来源: https://www.cnblogs.com/jrfr/p/10485982.html