题目背景
无
题目描述
为了检测生产流水线上总共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]。含义如前述。
输入输出样例
说明
[数据范围]
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; }