【洛谷 2251】质量检测

it2022-05-05  96

题目背景

题目描述

为了检测生产流水线上总共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\n",query(1,1,n,i,i+m-1)); return 0; }

 

转载于:https://www.cnblogs.com/wuhu-JJJ/p/11193218.html

相关资源:各显卡算力对照表!

最新回复(0)