【POJ】2823 - Sliding Window 双段队列
2017-09-13 23:09
288 查看
http://poj.org/problem?id=2823
给一个长度为N的数组,一个长为K的滑动窗体从最左移至最右端,只能见到窗口的K个数,每次窗体向右移动一位,便找出窗口在各位置时的最大值和最小值。
参考《挑战程序设计竞赛》P339
单调队列
单调队列队内元素单调递增或单调递减,所以每次的最小(最大)值一定会在队首。
给一个长度为N的数组,一个长为K的滑动窗体从最左移至最右端,只能见到窗口的K个数,每次窗体向右移动一位,便找出窗口在各位置时的最大值和最小值。
参考《挑战程序设计竞赛》P339
单调队列
单调队列队内元素单调递增或单调递减,所以每次的最小(最大)值一定会在队首。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <vector> #include <numeric> #include <algorithm> using namespace std; const int maxn=1000005; int n,k; int a[maxn]; int Min[maxn]; int Max[maxn]; int q1[maxn];//单增队列 int q2[maxn];//单减队列 int main(){ cin >> n >> k; for (int i=0;i<n;i++){ scanf("%d",a+i); } int s1=0,t1=0,s2=0,t2=0; for (int i=0;i<n;i++){ while (s1<t1&&a[q1[t1-1]]>=a[i]) t1--; q1[t1++]=i; while (s2<t2&&a[q2[t2-1]]<=a[i]) t2--; q2[t2++]=i; if (i-k+1>=0){ Min[i-k+1]=a[q1[s1]]; Max[i-k+1]=a[q2[s2]]; } if (q1[s1]==i-k+1){ s1++; } if (q2[s2]==i-k+1){ s2++; } } for (int i=0;i<=n-k;i++){ printf("%d%c",Min[i],i==n-k?'\n':' '); } for (int i=0 4000 ;i<=n-k;i++){ printf("%d%c",Max[i],i==n-k?'\n':' '); } }
相关文章推荐
- poj - 2823 - Sliding Window(单调队列)
- POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题
- POJ 2823 Sliding Window (单调队列)
- POJ 2823 Sliding Window(单调队列)
- POJ 题目2823 Sliding Window(单调队列求定长区间最大值)
- POJ 2823 Sliding Window(单调队列)
- poj 2823 Sliding Window 单调队列
- POJ 2823 Sliding Window 堆 / 单调队列
- POJ 2823 Sliding Window(单调队列||线段树)
- poj 2823 Sliding Window (单调队列)
- [ACM] poj 2823 Sliding Window (单调队列)
- POJ 2823 Sliding Window(单调队列)
- POJ 2823 Sliding Window 再探单调队列
- POJ 2823 Sliding Window 单调队列题解
- POJ 2823 Sliding Window 单调队列
- 【单调队列】POJ_2823 Sliding Window
- Poj 2823 Sliding Window【单调队列学习】模板记录
- 【POJ 2823 Sliding Window】 单调队列
- poj 2823 Sliding Window (单调队列)
- Poj 2823 Sliding Window(单调队列)