[LUOGU] P2251 质量检测

题目背景
无

题目描述
为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] = min{A1, A2, ... Am},以及第2至第M + 1件的Q[m + 1], Q[m + 2] ... 最后统计第N - M + 1至第N件的Q[n]。根据Q再做进一步评估。

请你尽快求出Q序列。

输入输出格式
输入格式:
输入共两行。

第一行共两个数N、M,由空格隔开。含义如前述。

第二行共N个数,表示N件产品的质量。

输出格式:
输出共N - M + 1行。

第1至N - M + 1行每行一个数,第i行的数Q[i + M - 1]。含义如前述。

输入输出样例
输入样例#1: 
10 4
16 5 6 9 5 13 14 20 8 12
输出样例#1: 
5
5
5
5
5
8
8
说明
[数据范围]

30%的数据,N <= 1000

100%的数据,N <= 100000

100%的数据,M <= N, A <= 1 000 000

单调队列裸题

#include<iostream>
#include<cstdio>

using namespace std;

inline int rd(){
    int ret=0,f=1;char c;
    while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
    while(isdigit(c))ret=ret*10+c-'0',c=getchar();
    return ret*f;
}

const int MAXN=1000005;

int n,m;
int a[MAXN];
int q[MAXN],h,t;
int main(){
    n=rd();
    m=rd();
    for(int i=1;i<=n;i++) a[i]=rd();
    for(int i=1;i<=n;i++){
        while(h<=t&&a[q[t]]>a[i])t--;
        q[++t]=i;
        while(h<=t&&q[h]+m<=i) h++;
        if(i>=m)printf("%d\n",a[q[h]]);
    }
}

猜你喜欢

转载自blog.csdn.net/gh0stcai/article/details/80729602