栈与队列-单调栈,单调队列
2017-12-13 15:34
274 查看
什么时候使用?
单调栈在均摊O(1) 即总时间复杂度为O(n)内实现找到某数右边第一个比它大(小)的数
单调队列
滑窗问题
在运行的过程中能够快速寻求前k个或后k个中最大或最小的值
我们直接来看实现吧
POJ3058发型糟糕的一天
#include <iostream> #include <stdio.h> #include <stack> using namespace std; stack<long> s; int T; long cnt; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif scanf("%d",&T); for(int i = 1; i <= T; i++) { long h; scanf("%ld",&h); while(!s.empty()&&(s.top() <= h)) { s.pop(); } cnt += s.size(); s.push(h); } // //一种会超时的解法 // for(int i = 1; i <= T; i++) // { // for(int j = i+1; j <= T; j++) // { // if(a[j] < a[i])cnt++; // else break; // } // } // 考虑使用左右两个指针 // for(int l = 1, r = 2; l <= T && r <= T;l++)//其实几乎就是模拟队列的实现了 // { // while(r <= T && l > r)r++; // if(a[r] < a[l]) cnt++; // } printf("%ld\n",cnt); #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
POJ3866滑动窗口
//看到这道题就回忆起单调栈&单调对列 //复习: 单调栈是用来寻找x后边第一个大于x的数 //单调队列是用来解决滑窗问题的 单调队列中的每一个元素都存储一个pair 第一个位表示它在 #include <iostream> #include <string.h> using namespace std; const int N = 1e6 + 8; int l, r; int n, k; int a ; pair<int,int> q ; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif scanf("%d%d",&n,&k); l = 1; r = 0; for(int i = 1; i <= n; i++) scanf("%d",&a[i]); for(int i = 1; i <= n;i++) { while(r >= l && i - q[l].first >= k) l++; while(r >= l && a[i] < q[r].second ) r--; q[++r].first = i, q[r].second = a[i]; if(i >= k)printf("%d ",q[l].second); } printf("\n"); memset(q,0,sizeof(q)); l = 1, r = 0; for(int i = 1; i <= n;i++) { while(r >= l && i - q[l].first >= k) l++; while(r >= l && a[i] > q[r].second ) r--; q[++r].first = i, q[r].second = a[i]; if(i >= k)printf("%d ",q[l].second); } printf("\n"); #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- 数据结构之单调栈单调队列模板
- DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
- POJ2823 Sliding Window 【单调队列、单调栈初步】
- 单调栈/单调队列/RMQ
- 单调栈、双端队列、单调队列
- 单调队列与单调栈总结
- POJ 3250 Bad Hair Day --单调栈(单调队列?)
- 单调队列,单调栈总结
- 单调队列 POJ 2823+单调栈 HDU 1506
- 单调队列,单调栈总结
- 单调栈和单调队列的概念与运用
- 单调队列 单调栈总结
- 九度1497:面积最大的全1子矩阵 (单调队列,单调栈)
- 浅谈单调队列、单调栈【转载】
- zjnu1735BOB (单调队列,单调栈)
- bzoj 1012 最大数(线段树|单调队列|单调栈)
- 单调栈及单调队列基础与运用
- 单调栈与单调队列
- POJ-2823 && POJ-3250 (单调队列 && 单调栈)