洛谷P1440 求m区间内的最小值

题目描述

一个含有 $n$ 项的数列,求出每一项前的 $m$ 个数到它这个区间内的最小值。若前面的数不足 $m$ 项则从第 $1$ 个数开始,若前面没有数则输出 $0$。

输入格式

第一行两个整数,分别表示 $n$,$m$。

第二行,$n$ 个正整数,为所给定的数列 $a_i$。

输出格式

$n$ 行,每行一个整数,第 $i$ 个数为序列中 $a_i$ 之前 $m$ 个数的最小值。

样例 #1

样例输入 #1

6 2 7 8 1 4 3 2

样例输出 #1

0 7 7 1 1 3

提示

对于 $100\%$ 的数据,保证 $1\le m\le n\le2\times10^6$,$1\le a_i\le3\times10^7$。

题解

#include <bits/stdc++.h> using namespace std; int n, m, x, l = 1, r = 1, a[2000010], q[2000010]; int main() { scanf("%d%d", &n, &m); printf("0\n"); for (int i = 1; i <= n - 1; i++) { scanf("%d", &a[i]); while (a[q[r - 1]] >= a[i] && l < r) r--; q[r++] = i; if (i - q[l] + 1 > m) l++; printf("%d", a[q[l]]); if (i != n - 1) printf("\n"); } cout << endl; // For Powershell Debugging return 0; }