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\n",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\n",p[q[str]]);

37     }

38     return 0;

39 }
View Code

 

你可能感兴趣的:(storm)