poj 2823(单调队列)
2015-08-13 17:25
232 查看
题意:有n个数字要按顺序进入一个窗口,窗口大小是k,问每次窗口内的k个数字的最小值和最大值。
题解:之前好像做过单调队列类型的题,但具体又忘了,所有再次学习一遍,这题应该是比较简单的模板题,维护队列内的值,保证输出都在队首,因为窗口大小是k,所以一旦队首的位置加k小于当前位置,就把队首向后移动。
题解:之前好像做过单调队列类型的题,但具体又忘了,所有再次学习一遍,这题应该是比较简单的模板题,维护队列内的值,保证输出都在队首,因为窗口大小是k,所以一旦队首的位置加k小于当前位置,就把队首向后移动。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1000005; int n, k, a , q , pos ; void get_min() { int st = 1, en = 0; for (int i = 0; i < k - 1; i++) { while (st <= en && q[en] >= a[i]) en--; q[++en] = a[i]; pos[en] = i; } for (int i = k - 1; i < n; i++) { while (st <= en && q[en] >= a[i]) en--; q[++en] = a[i]; pos[en] = i; while (pos[st] + k < i + 1) st++; printf("%d", q[st]); if (i < n - 1) printf(" "); else printf("\n"); } } void get_max() { int st = 1, en = 0; for (int i = 0; i < k - 1; i++) { while (st <= en && q[en] <= a[i]) en--; q[++en] = a[i]; pos[en] = i; } for (int i = k - 1; i < n; i++) { while (st <= en && q[en] <= a[i]) en--; q[++en] = a[i]; pos[en] = i; while (pos[st] + k < i + 1) st++; printf("%d", q[st]); if (i < n - 1) printf(" "); else printf("\n"); } } int main() { while (scanf("%d%d", &n, &k) == 2) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); get_min(); get_max(); } return 0; }
相关文章推荐
- 2440启动代码分析
- C++ primer 【笔记】关联容器 set
- Linux学习笔记---文件解压缩命令---gzip ==
- iOS每日一记之---------改变Btn点击时的背景颜色
- 不同.net版本实现单点登录
- Web开发基础知识
- HDU 1251 统计难题 trie树
- Centos7安装配置Mongodb3
- 一个计时器, 点击按钮 让他 停一会, 5s后继续自动运行
- iNOC产品部-杨辉三角的变形
- Prime Path(POJ--3126
- 按返回键的时候实现按home键的效果
- KMP算法模板
- 在本地机器上能访问tomcat,远程机器访问不了的解决方法
- sql字符串累加
- GridView控件实现数据的修改(第9节)
- java GUI(UI创建与监听机制)
- HttpClient
- Consistent Hashing算法
- Androidpn服务器搭建及集成进自己的用户表