poj 2823题解

Posted suansuan918106840226

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 2823题解相关的知识,希望对你有一定的参考价值。

这道题就是单调队列的裸题 今天刚学的单调队列  前几天刚学习完单调栈 感觉这两个东西非常相似哇

黄哥的一句话说破了他 他俩的区别就像队列和栈的区别233333

有关这道题倒没有太多说的 就是模拟队列 单调递增递减来找到区间最值 我这里用了数组模拟

问题就是G++ T了///  而C++ AC  就很迷。。。还是oj是 windows linux的区别吧大概

附上代码

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 using namespace std;
 5 #define ll long long 
 6 #define inf 0x3f3f3f3f
 7 const int N=1e6+50;
 8 int n,k;
 9 int a[N];
10 int q[N];
11 int main(){
12     scanf("%d%d",&n,&k);
13         for(int i=1;i<=n;i++){
14             scanf("%d",&a[i]);
15         }
16         int j=1,b=1;
17         a[0]=-inf;
18         q[1]=1;
19         for(int i=2;i<k;i++){
20             while(a[i]<=a[q[j]]&&j>=b){
21                 j--;
22             }
23             q[++j]=i;
24         }
25         for(int i=k;i<=n;i++){
26             while(q[b]<=i-k&&j>=b)b++;
27             while(a[i]<=a[q[j]]&&j>=b){
28                 j--;
29             }
30             q[++j]=i;
31             if(i!=n)printf("%d ",a[q[b]]);
32             else printf("%d
",a[q[b]]);
33         }
34         memset(q,0,sizeof(q));
35         j=1,b=1;
36         a[0]=inf;
37         q[1]=1;
38         for(int i=2;i<k;i++){
39             while(a[i]>=a[q[j]]&&j>=b)j--;
40             q[++j]=i;
41         }
42         for(int i=k;i<=n;i++){
43             while(q[b]<=i-k&&j>=b)b++;
44             while(a[i]>=a[q[j]]&&j>=b)j--;
45             q[++j]=i;
46             if(i!=n)printf("%d ",a[q[b]]);
47             else printf("%d",a[q[b]]);
48         }
49 
50 }

 

以上是关于poj 2823题解的主要内容,如果未能解决你的问题,请参考以下文章

poj 2823 Sliding Window 题解

题解报告:poj 2823 Sliding Window(单调队列)

POJ 2823 Sliding Window(单调队列)

Sliding Window POJ - 2823

poj2823Sliding Window——单调队列

POJ 2823 双端队列