AcWing 154. 滑动窗口
原题链接
简单
作者:
葱花鸡蛋
,
2020-04-09 15:19:07
,
所有人可见
,
阅读 564
我好菜啊
#include <bits/stdc++.h>
using namespace std;
//num存放的是数组的元素, q存放的是队列的下标
int num[1000050], q[1000050];
int main()
{
int n; cin >> n;
int k; cin >> k;
for (int i = 0; i < n; ++i) cin >> num[i];
//hh队头, tt队尾
int hh = 0, tt = -1;
for (int i = 0; i < n; ++i) {
//检查队列不为空 && 当对头的下标已经在窗口内
if (hh <= tt && q[hh] < i - k + 1) ++ hh;
//i < j && a[i] > a[j]的情况下:a[i]永远不可能出现 所以 --tt下面一步就会覆盖掉
while (hh <= tt && num[q[tt]] >= num[i]) -- tt;
//每个元素的下标都会被存进去,但是后面就可能会被覆盖掉
q[++ tt] = i;
//取出对头
if (i >= k - 1) cout << num[q[hh]] << " ";
}
cout << endl;
hh = 0, tt = -1;
for (int i = 0; i < n; ++i) {
if (hh <= tt && q[hh] < i - k + 1) ++ hh;
while (hh <= tt && num[q[tt]] <= num[i]) -- tt;
q[++ tt] = i;
if (i >= k - 1) cout << num[q[hh]] << " ";
}
cout << endl;
return 0;
}
没我菜
害,这个板子看了好久了