洛谷 P1440 求m区间内的最小值
思路
由于数据范围很大,所以使用单调队列,和滑动窗口这道题类似
首先第一个数输出(0),因为第一个数之前没有数
然后通过样例我们发现,最后一个数并没有派上什么用场,所以循环(n-1)轮即可
这里的单调队列是记录的序号,每次输入(a[i]),检测它是不是比当前的队尾大,如果比队尾大直接入队,反之与队尾比较((r--))直至比队尾大为止。当长度超过(m)时,(l++),最后的队首就是答案
代码
#include <iostream>
#include <cstdio>
using namespace std;
inline int read() {
char c = getchar();
int x = 0, f = 1;
for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
return x * f;
}
const int N = 20000011;
int n, m, q[N], a[N], l = 1, r = 1, x;
int main() {
n = read(), m = read();
cout << "0
";
for(int i = 1; i < n; i++) {
a[i] = read();
while(a[q[r - 1]] >= a[i] && l < r) r--;
q[r++] = i;
if(i - q[l] + 1 > m) l++;
cout << a[q[l]] << '
';
}
return 0;
}