博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1886 滑动窗口(单调队列)
阅读量:5325 次
发布时间:2019-06-14

本文共 1422 字,大约阅读时间需要 4 分钟。

嗯...

 

题目链接:https://www.luogu.org/problem/P1886

 

首先这道题很典型,是标准的单调队列的模板题(也有人说单调队列只能解决这一个问题)。这道题可以手写一个队列,也可以用STL中的双端队列...

核心思路:如果一个人比你强并且比你小,那么你无法超过他...

 

我们把区间最大值和最小值分开求,下面讲解最大值,最小值则反之:

如果队列中有元素并且这个元素比要插入的元素大,即这个人比你强还比你小,那么你永远不能比他强,所以就让你出队,然后让那个人入队。接着处理“退役”的人,如果这个人虽然曾在队列中,但是不在现在的窗口中,那么也把它从队首弹出。

最后注意初始化队列为空和输出...

 

AC代码:

1 #include
2 #include
3 4 using namespace std; 5 const int maxn = 1e6 + 5; 6 int n, k, head, tail, a[maxn]; 7 8 struct node{ 9 int id, val;10 } q[maxn];11 12 inline void work_min(){13 head = 1; tail = 0;14 for(int i = 1; i <= n; i++){15 while(head <= tail && a[i] <= q[tail].val) tail--;16 q[++tail].id = i;17 q[tail].val = a[i];18 while(q[head].id <= i - k) head++;19 if(i >= k) printf("%d ", q[head].val);20 }21 printf("\n");22 }23 24 inline void work_max(){25 head = 1; tail = 0;//初始化 26 for(int i = 1; i <= n; i++){27 while(head <= tail && a[i] >= q[tail].val) tail--;//比你小比你强 28 q[++tail].id = i;29 q[tail].val = a[i];30 while(q[head].id <= i - k) head++;//退役 31 if(i >= k) printf("%d ", q[head].val);//输出 32 }33 printf("\n");34 }35 36 int main(){37 scanf("%d%d", &n, &k);38 for(int i = 1; i <= n; i++) scanf("%d", &a[i]);39 work_min();40 work_max();41 return 0;42 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11290772.html

你可能感兴趣的文章
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>
移动、联通和电信,哪家的宽带好,看完你就知道该怎么选了!
查看>>
Linux设置环境变量的方法
查看>>
构建自己的项目管理方案
查看>>
利用pca分析fmri的生理噪声
查看>>
div水平居中且垂直居中
查看>>
epoll使用具体解释(精髓)
查看>>