洛谷—— P2251 质量检测

https://www.luogu.org/problemnew/show/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

 

 1 #include <cstdio>
 2 
 3 #define min(a,b) (a<b?a:b)
 4 
 5 inline void read(int &x)
 6 {
 7     x=0; register char ch=getchar();
 8     for(; ch>'9'||ch<'0'; ) ch=getchar();
 9     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
10 }
11 const int N(1000005);
12 int n,m,st[N][20],log2[N],t;
13 
14 int Presist()
15 {
16     read(n),read(m);
17     for(int i=1; i<=n; ++i)
18         read(st[i][0]),log2[i]=(1<<t+1==i)?++t:t;
19     for(int j=1; 1<<j<=n; ++j)
20       for(int i=1; i+(1<<j)<=n+1; ++i)
21         st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);
22     for(int r,l=1,mid=log2[m]; l<=n-m+1; ++l)
23     {
24         r=l+m-1;
25         printf("%d\n",min(st[l][mid],st[r-(1<<mid)+1][mid]));
26     }
27     return 0;
28 }
29 
30 int Aptal=Presist();
31 int main(int argc,char**argv){;}

 

posted @ 2017-11-06 21:09  Aptal丶  阅读(259)  评论(0编辑  收藏  举报