单调队列

 1 /*
 2   题意:n,k<=1e6 给定一个长度为n的数组和大小为k的滑动窗口,求每次的最值
 3   思路:单调队列
 4   时间:2018.07.17
 5 */
 6 // #include <bits/stdc++.h>
 7 #include <cstdio>
 8 #include <iostream>
 9 using namespace std;
10 
11 typedef long long LL;
12 const int MAXN=1000005;
13 const LL MOD7 = 1e9+7;
14 
15 int a[MAXN];
16 int n,K;
17 
18 struct Node
19 {
20     int x;
21     int idx;
22     Node(){}
23     Node(int x,int idx):x(x),idx(idx){}
24 }q[MAXN];
25 int head,tail;
26 
27 void minQueue()
28 {
29     head=tail=0;
30     for (int i=1;i<min(n,K);++i)
31     {
32         while (head!=tail && a[i]<q[tail-1].x) --tail;
33         q[tail].x=a[i];
34         q[tail++].idx=i;
35     }
36     int flag=0;
37     for (int i=min(n,K);i<=n;++i)
38     {
39         while (head!=tail && q[head].idx+K-1<i) ++head;
40         while (head!=tail && a[i]<q[tail-1].x) --tail;
41         q[tail].x = a[i];
42         q[tail++].idx=i;
43         if (!flag)
44         {
45             printf("%d",q[head].x);
46             flag=1;
47         }
48         else printf(" %d",q[head].x);
49     }
50     printf("\n");
51 }
52 
53 void maxQueue()
54 {
55     head=tail=0;
56     for (int i=1;i<min(n,K);++i)
57     {
58         while (head!=tail && q[tail-1].x<a[i]) --tail;
59         q[tail].x=a[i];
60         q[tail++].idx=i;
61     }
62     int flag=0;
63     for (int i=min(n,K);i<=n;++i)
64     {
65         while (head!=tail && q[head].idx+K-1<i) ++head;
66         while (head!=tail && q[tail-1].x<a[i]) --tail;
67         q[tail].x=a[i];
68         q[tail++].idx=i;
69         if (!flag)
70         {
71             printf("%d",q[head].x);
72             flag=1;
73         } else {
74             printf(" %d",q[head].x);
75         }
76     }
77     printf("\n");
78 }
79 
80 int main()
81 {
82 #ifndef ONLINE_JUDGE
83     freopen("test.txt","r",stdin);
84 #endif // ONLINE_JUDGE
85     // while (scanf("%d%d",&n,&K)!=-1)
86     scanf("%d%d",&n,&K);
87     {
88         for (int i=1;i<=n;++i) scanf("%d",&a[i]);
89         minQueue();
90         maxQueue();
91     }
92     return 0;
93 }

 

posted @ 2018-07-17 21:10  LeeSongt  阅读(138)  评论(0)    收藏  举报