【洛谷 2251】质量检测

题目背景

题目描述

为了检测生产流水线上总共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

题解:ST表题目,但我用线段树%%%

#include<cstdio>
#include<iostream>
#include<cstring>
#define ri register int
#define lson o<<1
#define rson o<<1|1
#define N 100000
using namespace std;
int a[N+1],Min[N<<2+1],add[N<<2+1];
int n,m;
inline int read()
{
    int res=0,flag=1;
    char ch;
    for(;!isdigit(ch);ch=getchar())
        if(ch=='-')flag=-1;
    for(;isdigit(ch);ch=getchar())
        res=res*10+ch-48;
    return res*flag;
}
inline int push_up(int o)
{
    Min[o]=min(Min[lson],Min[rson]);
}
inline int push_down(int o)
{
    if(!add[o])return 0;
    add[lson]+=add[o];
    add[rson]+=add[o];
    Min[lson]+=add[o];
    Min[rson]+=add[o];
    add[o]=0;
}
inline int build(int o,int l,int r)
{
    add[o]=0;
    if(l==r)
    {
        Min[o]=a[l];
        return 0;
    }
    int mid=(l+r)>>1;
    build(lson,l,mid);
    build(rson,mid+1,r);
    push_up(o);
}
inline int query(int o,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)return Min[o];
    int mid=(l+r)>>1,ans=0x7fffffff;
    if(ql<=mid)ans=min(ans,query(lson,l,mid,ql,qr));
    if(qr>mid)ans=min(ans,query(rson,mid+1,r,ql,qr));
    return ans;
}
int main()
{
    n=read();m=read();
    for(ri i=1;i<=n;i++)a[i]=read();
    build(1,1,n);
    for(ri i=1;i<=n-m+1;i++)
        printf("%d
",query(1,1,n,i,i+m-1));
    return 0;
}
原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11193218.html