手写单调队列板子
发布日期:2021-06-30 10:13:25 浏览次数:3 分类:技术文章

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

#include 
using namespace std;const int maxn=1000009;int q[maxn],p[maxn],head,tail;int a[maxn],n,k;int main(){ cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; head=1,tail=0; //为啥要这样呢?因为head要严格对应首元素,tail要严格对应尾元素, //所以当tail>=head时,说明有元素。而一开始队列为空,说一要这样赋值。其实这跟普通队列一样。 for(int i=1;i<=n;i++)//单调最大,队首元素最小 { while(head<=tail&&q[tail]>=a[i]) tail--;//排除比我早入队且值比我大的 q[++tail]=a[i],p[tail]=i; while(p[head]<=i-k) head++;//排除过时元素 if(i>=k) printf("%d ",q[head]);//在区间k中滑动 } head=1,tail=0; cout<
=k) printf("%d ",q[head]); } return 0;}

相关好题

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/104519082 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:线段树
下一篇:匈牙利算法

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月08日 11时32分50秒