洛谷P2251 質量檢測

自為風月馬前卒發表於2017-10-22

題目背景

題目描述

為了檢測生產流水線上總共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 }

 

相關文章