AcWing 154. 滑动窗口
原题链接
简单
作者:
日暮途远
,
2020-01-19 21:48:03
,
所有人可见
,
阅读 895
/*
就是在y总基础课滑动窗口那题,
利用正负1把2个循环代码压缩成1个for循环代码
就是代码量优化了点。0.0
*/
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int arr[N], q[N], hh, tt;
void init(){
hh = 0;
tt = -1;
}
//根据传入的sw的值(相当于一个开关)决定当前寻找的是最大还是最小
//1表示最小值,-1表示最大值
void slide(int n, int k, int sw){
for(int i = 0; i < n; i++){
if(hh <= tt && q[hh] < i - k + 1) hh++;
while(hh <= tt && arr[i] * sw <= arr[q[tt]] * sw) tt--;
q[++tt] = i;
if(i + 1 >= k) cout << arr[q[hh]] << " ";
}
}
int main(){
int n, k;
cin >> n >> k;
for(int i = 0; i < n; i++) scanf("%d", &arr[i]);
init();
slide(n, k, 1);
puts("");
init();
slide(n, k, -1);
return 0;
}
优雅!