无
为了检测生产流水线上总共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<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 #include<deque>
7 #define LL long long
8 #define lb(x) ((x)&(-x))
9 using namespace std;
10 const int MAXN=1000001;
11 inline int read()
12 {
13 char c=getchar();int x=0,f=1;
14 while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
15 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*f;
16 }
17 struct node
18 {
19 int pos,val;
20 node(){ pos=val=0; }
21 node(int a,int b){ pos=a,val=b; }
22 };
23 deque<node>q;
24 int a[MAXN];
25 int main()
26 {
27 int n=read(),m=read();
28 for(int i=1;i<=n;i++)
29 a[i]=read();
30 for(int i=1;i<=n;i++)
31 {
32 while(q.size()>0&&i-m>=q.front().pos) q.pop_front();
33 while(q.size()>0&&a[i]<=q.back().val) q.pop_back();
34 q.push_back(node(i,a[i]));
35 if(i>=m) printf("%d\n",q.front().val);
36 }
37 return 0;
38 }