码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2823题解

时间:2020-01-31 18:32:19      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:space   ++   lse   pre   while   ios   i++   fine   今天   

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

黄哥的一句话说破了他 他俩的区别就像队列和栈的区别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\n",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题解

标签:space   ++   lse   pre   while   ios   i++   fine   今天   

原文地址:https://www.cnblogs.com/suansuan918106840226/p/12246059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!