1126. Magnetic Storms(单调队列)

1126

最简单的单调队列应用吧

单调队列是指在一个队列中各个元素单调 递增(或者递减),并且各个元素的下标单调 递增。

单调队列的大体操作

进队时,将进队的元素为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 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3332293.html