题目描述
有一个 1×𝑛1×n 的矩阵,有 𝑛n 个整数。
现在给你一个可以盖住连续 𝑘k 个数的木板。
一开始木板盖住了矩阵的第 1∼𝑘1∼k 个数,每次将木板向右移动一个单位,直到右端与第 𝑛n 个数重合。
每次移动前输出被覆盖住的数字中最大的数是多少。
输入格式
第一行两个整数 𝑛,𝑘n,k,表示共有 𝑛n 个数,木板可以盖住 𝑘k 个数。
第二行 𝑛n 个整数,表示矩阵中的元素。
输出格式
共 𝑛−𝑘+1n−k+1 行,每行一个整数。
第 𝑖i 行表示第 𝑖∼𝑖+𝑘−1i∼i+k−1 个数中最大值是多少。
输入输出样例
输入 #1复制
5 3 1 5 3 4 2
输出 #1复制
5 5 4
说明/提示
对于 20%20% 的数据,1≤𝑘≤𝑛≤1031≤k≤n≤103。
对于 50%50% 的数据,1≤𝑘≤𝑛≤1041≤k≤n≤104。
题解
#include <iostream>
using namespace std;
#include <algorithm>
const int N=2000003;
int q[N],a[N];
int n,k,l,r;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
l=1,r=0;
for(int i=1;i<=n;i++){
while(l<=r&&a[q[r]]<=a[i]) r--; //去尾
q[++r]=i;
if(i>=k){
while(l<=r&&q[l]<=i-k) l++; //删头
printf("%d\n",a[q[l]]);
}
}
}