最简单的单调队列应用吧
单调队列是指在一个队列中各个元素单调 递增(或者递减),并且各个元素的下标单调 递增。
单调队列的大体操作
进队时,将进队的元素为e,从队尾往前扫描,直到找到一个不大于e的元素d,将e放在d之后,舍弃e之后的所有元素;如果没有找到这样一个d,则将e放在队头(此时队列里只有这一个元素)。
出队时,将出队的元素为e,从队头向后扫描,直到找到一个元素f比e后进队,舍弃f之前所有的。(实际操作中,由于是按序逐个出队,所以每次只需要出队只需要比较队头)。
每个元素最多进队一次,出队一次,摊排分析下来仍然是 O(1)。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<queue> 7 using namespace std; 8 #define N 25020 9 int p[N],q[N]; 10 int main() 11 { 12 int i=0,j,k,m,maxz=0; 13 scanf("%d",&m); 14 while(scanf("%d",&k)!=EOF) 15 { 16 if(k==-1) break; 17 i++; 18 p[i] = k; 19 maxz = max(maxz,k); 20 } 21 if(m>=i) 22 { 23 printf("%d ",maxz); 24 return 0; 25 } 26 int str=1,end=1; 27 for(j = 1; j <= i ; j++) 28 { 29 while(end>=str&&p[j]>=p[q[end]]) 30 end--; 31 end++; 32 q[end] = j; 33 while(q[str]<=j-m) 34 str++; 35 if(j>=m) 36 printf("%d ",p[q[str]]); 37 } 38 return 0; 39 }