[poj2823]Sliding Window(单调队列)

2021-05-07 21:27

阅读:537

标签:span   namespace   eof   return   注意   iostream   否则   超时   style   

题意:给定一个序列,求所有滑动窗口内的最值。

解题关键:单调队列裸题,单调递增队列选取最小值,单调递减队列选取最大值。

注意用c++提交,否则会超时。

 1 #include 2 #include 3 #include
 4 #include 5 #include 6 #include 7 #define maxn 1000005
 8 using namespace std;
 9 typedef long long ll;
10 int n,k;
11 int min1[maxn],max1[maxn],pos1[maxn],que1[maxn],a[maxn];
12 inline int read(){
13     char k=0;char ls;ls=getchar();for(;ls‘0||ls>9;k=ls,ls=getchar());
14     int x=0;for(;ls>=0&&ls‘9;ls=getchar())x=(x3)+(x1)+ls-0;
15     if(k==-)x=0-x;return x;
16 }
17 inline void get_min(int n,int k){
18     int head=0,rear=0;
19     for(int i=1;i){
20         while(rear>head&&que1[rear-1]>a[i]) rear--;
21         que1[rear]=a[i];
22         pos1[rear]=i;
23         rear++;
24     }
25     for(int i=k;i){
26         while(rear>head&&que1[rear-1]>a[i]) rear--;
27         que1[rear]=a[i];
28         pos1[rear]=i;
29         rear++;
30         while(pos1[head]1) head++;
31         min1[i]=que1[head];
32     }
33 }
34 inline void get_max(int n,int k){
35     int head=0,rear=0;
36     for(int i=1;i){
37         while(rear>head&&que1[rear-1];
38         que1[rear]=a[i];
39         pos1[rear]=i;
40         rear++;
41     }
42     for(int i=k;i){
43         while(rear>head&&que1[rear-1];
44         que1[rear]=a[i];
45         pos1[rear]=i;
46         rear++;
47         while(pos1[head]1) head++;
48         max1[i]=que1[head];
49     }
50 }
51 int main(){
52     while(scanf("%d%d",&n,&k)!=EOF){
53         for(int i=1;iread();
54         get_min(n,k);
55         get_max(n,k);
56         for(int i=k;i){
57             printf("%d%c",min1[i],i==n?\n: );
58         }
59         for(int i=k;i){
60             printf("%d%c",max1[i],i==n?\n: );
61         }
62     }
63 } 

 

[poj2823]Sliding Window(单调队列)

标签:span   namespace   eof   return   注意   iostream   否则   超时   style   

原文地址:http://www.cnblogs.com/elpsycongroo/p/7639470.html

上一篇:winsock客户端

下一篇:winsock服务端


评论


亲,登录后才可以留言!