上午
教练让补补坑
先改了改以前的题,然后开始透彻几道题
1.滑稽窗口
以前总是感觉迷迷糊糊不太透彻,今天tmd终于搞明白了
我们维护一个希望维护一个长度为m的队列,对于求最小值的时候,我们维护单增队列,所以队尾一定要保证是最大的
所以对于当前的\(a[i]\),我们必须保证\(a[i] > a[q[t]]\)才能使其入队,否则就一直让队尾缩短
对于求最大值的时候,我们希望维护一个递减队列,保证队尾最小
所以同理,对于当前的\(a[i]\),我们保证\(a[i] > a[q[t]]\)才能使其入队,否则一直\(--t\)
(最近超喜欢写han yu pin yin 的函数)
return ~~(0^_^0);
其中
define _ 0
下面给出漂亮的代码
#include <bits/stdc++.h>
#define _ 0
using namespace std;
const int N = 1e6+66;
int n, m;
int a[N], q[N];
inline void shuruyijichushihua () {
cin >> n >> m;
for (int i = 1; i <= n; ++ i) cin >> a[i];
}
inline void caozuoyifan () {
int h = 1, t = 0;
for (int i = 1; i <= n; ++ i) {
while (h <= t && q[h] + m <= i) ++ h;
while (h <= t && a[i] < a[q[t]]) -- t;
q[++ t] = i;
if (i >= m) cout << a[q[h]] << ' ';
}
cout << '\n';
memset(q, 0, sizeof q);
for (int i = 1; i <= n; ++ i) {
while (h <= t && q[h] + m <= i) ++ h;
while (h <= t && a[i] > a[q[t]]) -- t;
q[++ t] = i;
if (i >= m) cout << a[q[h]] << ' ';
}
}
int main () {
shuruyijichushihua();
caozuoyifan();
return ~~(0^_^0);
}