单调队列
来源:互联网 发布:备案是域名还是空间 编辑:程序博客网 时间:2024/06/05 14:28
模板题
题目链接:http://poj.org/problem?id=2823
单调队列的模板,用到了双端队列。需要输出一个最大,一个最小,起初先用了两个队列分别求解最大最小,存在两个数组里面,但发现时间超时,必须优化,所以就改成用一个队列,但这里我用的pair 构造了一个容器,之后直接输出就可以,但是空格和回车我之前用printf输出,会超时,改成putchar 之后勉强通过,如果改成用数组存起来,最后输出,可以缩短时间。下面是代码:
#include<cstdio>#include<iostream>#include<deque>using namespace std;int window[1000005];int maxn[1000005];int mint[1000005];int n,k,t;int main(){ scanf("%d%d", &n, &k); for(int i = 1; i<= n; i++) { scanf("%d", &window[i]); } deque<pair<int, int> >q; for(int i = 1; i<= n; i++) { int val = window[i]; while(!q.empty() && q.back().first >= val){ q.pop_back(); } q.push_back(make_pair(val,i)); if(i >= k) { while(!q.empty() && q.front().second < i - k + 1){ q.pop_front(); } ///printf("%d", q.front().first); ///if(i!=n) ///putchar(' '); mint[t++] = q.front().first; } } ///putchar('\n'); q.clear(); t=0; for(int i = 1; i<= n; i++) { int val = window[i]; while(!q.empty() && q.back().first <= val){ q.pop_back(); } q.push_back(make_pair(val,i)); if(i >= k) { while(!q.empty() && q.front().second < i - k + 1){ q.pop_front(); } ///printf("%d", q.front().first);///是第一种方法 ///if(i!=n) ///putchar(' '); maxn[t++] = q.front().first;///第二种方法 } } ///putchar('\n'); for(int i = 0; i< t; i++){ printf("%d",mint[i]); if(i!=t-1) printf(" "); } printf("\n"); for(int i = 0; i< t; i++){ printf("%d",maxn[i]); if(i!=t-1) printf(" "); } return 0;}
0 0
- 单调栈 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- String.format()用法
- 模式识别导论
- Java中的Scanner类的用法以及其他获取键盘输入的方法
- codeforces--370 C--三角形
- linux多线程学习(五)——信号量线程控制
- 单调队列
- 设计模式-装饰模式
- Android中ADB用法总结
- error LNK2019: unresolved external symbol
- iOS 开发中判断字符串是否为空字符的方法
- 关于PHP中websocket使用的详细注解
- 关于Alipay支付宝接口(Java版)
- 以ant方式从visual svn server checkout
- android studio配置butterknife 8.0以上版本