题目大意

给出一段序列,一个长度一定的窗口从左到右滑动。求窗口滑动到每个位置时窗口内数字的最大值、最小值各是多少。n<=1e6。

总体思路

遇到这种对一个沿着一个方向滑动的区间求最值问题,可以运用单调队列优化。以求最小值为例。对整个序列构造一队列维护元素的下标,供多个窗口重复使用。设窗口左右端点各为l,r。要求对每个[l,r],通过一些操作,使得该队列满足下列条件:

  1. 元素只属于[l,r]。
  2. 从左到右下标对应的值必须是递增的。
  3. 元素∈[l,r]的数量最多。

这样,该队列就会达到以下效果:

  1. 对于当前区间的最值,队首对应的值便是答案。
  2. 保证以后的[l+1, r+1]区间要找最值就在这个队列里找,不会漏

这样每次遇到一个r,

  1. 不断从队首出队直到队首的下标>=l(满足条件1)
  2. 将对应数大于r对应数的队尾元素从队尾弹出(满足条件2),将r入列(满足条件3).
  3. 直接输出队首下标所对应数(利用条件2)
#include <cstdio>
#include <cstring>
#include <deque>
#include <cstdarg>using namespace std;#define LOOP(i, n) for(int i=0; i<n; i++)
const int MAX_N = 1000010;struct IntDeque
{int a[MAX_N], head, tail;void clear() { head = tail = 0; }void push_back(int x) { a[tail++] = x; }void pop_back() { tail--; }void pop_front() { head++; }bool empty() { return head == tail; }int front() { return a[head]; }int back() { return a[tail - 1]; }
};void Proceed(int*val, int n, int k , bool(*opt)(int,int))
{static IntDeque pQ;pQ.clear();LOOP(curR, n){int curL = curR - k + 1;while (!pQ.empty() && pQ.front() < curL)pQ.pop_front();while (!pQ.empty() && opt(val[curR], val[pQ.back()]) )pQ.pop_back();pQ.push_back(curR);if (curL >= 0)printf("%d ", val[pQ.front()]);}printf("\n");
}bool _lt(int x, int y)
{return x < y;
}
bool _gt(int x, int y)
{return x > y;
}int main()
{
#ifdef _DEBUGfreopen("c:\\noi\\source\\input.txt", "r", stdin);
#endifint n, k;static int val[MAX_N];memset(val, 0, sizeof(val));scanf("%d%d", &n, &k);LOOP(i, n)scanf("%d", i + val);Proceed(val, n, k,_lt);Proceed(val, n, k, _gt);return 0;
}

  

  

转载于:https://www.cnblogs.com/headboy2002/p/8484436.html

POJ2823 Sliding Window 单调队列相关推荐

  1. POJ 2823 Sliding Window (单调队列)

    单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...

  2. Sliding Window 单调队列解决--经典滑动窗口问题--求窗口的最大值最小值

    http://poj.org/problem?id=2823 这就要用到单调递减或单调递增队列来实现,它的头元素一直是队列中的最小值或最大值.我们可以从队列的末尾插入一个元素,可以从队列的两端删除元素 ...

  3. POJ2823 Sliding Window【单调队列】【线段树】【ST表】

    Sliding Window POJ - 2823 题意: 给出一个长度为N的序列,通过一个窗口,可以看到序列中连续的K个元素,窗口从最左边出发,每次移动一个单位,对于每次移动,输出当前窗口中的最大值 ...

  4. POJ 2823-Sliding Window单调队列解题报告

    链接:http://poj.org/problem?id=2823 利用单调队列的出队入队,维护区间的最值,保证队列单调递增或单调递减,要维护单调递增队列,当一个数字插入的时候,从队尾往前找到第一个比 ...

  5. poj2823 Sliding Window

    题目链接:http://poj.org/problem?id=2823 题意: 一个长度为n的序列上有一个长度为k的滑窗从左向右滑动,问每个时刻滑窗内最小值和最大值. 题解: 我们考虑单调队列. 对于 ...

  6. POJ2823 滑动窗口 单调队列模板题 第一次用了发函数指针

    题意 有一个n长的序列,用k长的窗口在上面滑动,去每次窗口中最小和最大的数. 思路 使用单调队列,维护这个队列是单调的.以取最小元素为例,若窗口内左边元素>=右边元素,则左边元素失去保留的意义, ...

  7. [summary] 单调队列

    2019独角兽企业重金招聘Python工程师标准>>> 很久没做单调队列了╮(╯_╰)╭ 已经不太会了.... 单调队列究其本质就是队列,加上队尾可以删除. 队列都是从队尾插入,队首 ...

  8. 单调队列————[USACO09MAR]向右看齐Look Up

    先了解一下单调队列: 很明显的具有单调性 分为单调递增和单调递减两种,简单点讲就是维护队头为最大值或者为最小值 (建议采用双向队列  比较好写) 具体步骤:(这个是单调递减) 如果队列非空且当前值比队 ...

  9. Sliding Window(单调队列)

    题目 An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving fro ...

最新文章

  1. 桌面图标不透明的小问题处理
  2. C# web api 中过滤器的使用
  3. js父页面和子页面之间传值
  4. mybatis实战教程(mybatis in action),mybatis入门到精通
  5. python中matrix是什么意思_Python的基础语法
  6. 【51Nod - 1001 】 数组中和等于K的数对 (排序+ 尺取)
  7. 利用资源文件实现多语言的系统
  8. Linux工作笔记033---Linux(CentOS7)安装zip、unzip命令
  9. Windows 10 上强制Visual Studio以管理员身份运行
  10. Kaggle 注册手机号以获取GPU资源
  11. 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人!
  12. UVA10523 Very Easy !!!题解
  13. 公式推导 11-22
  14. FFmpegFFplay常用命令汇总
  15. 第六章 算法algorithms
  16. Polynomial Commitments代码实现【2】——lovesh/kzg-poly-commit
  17. kafka streams 中streams.errors.StreamsException: java.nio.file.DirectoryNotEmptyException
  18. 边缘计算 | 在移动设备上部署深度学习模型的思路与注意点
  19. HTML邮件制作心得
  20. 懒人数据库 MongoDB 5.x

热门文章

  1. Markdown编辑器常用功能以及快捷键介绍
  2. ubuntu虚拟机进程被杀死_Linux进程被杀掉(OOM killer),查看系统日志
  3. Day9 深度学习入门
  4. 【flink】Flink常见Checkpoint超时问题排查思路
  5. 【算法】栈实现综合表达式计算
  6. 【kafka】Found a message larger than the maximum fetch size of this consumer on topic
  7. 【SpringCloud】 failed to req API:/nacos/v1/ns/instance after all servers code:500 msg Read timed out
  8. 【Mac】Mac iTerm2 使用笔记 远程连接
  9. 【janino】janino 加载自定义函数报错 CompileException xxx cannot be invoked in static context
  10. drool 7.x 属性:duration