洛谷 P1440 求m区间内的最小值

来源:互联网 发布:ai mac中文版免费下载 编辑:程序博客网 时间:2024/06/06 17:44

题目描述

一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。

输入输出格式
输入格式:

第一行两个数n,m。

第二行,n个正整数,为所给定的数列。

输出格式:

n行,第i行的一个数ai,为所求序列中第i个数前m个数的最小值。

输入输出样例

输入样例#1:
6 2
7 8 1 4 3 2

输出样例#1:
0
7
7
1
1
3

说明

【数据规模】

m≤n≤2000000


【分析】
大晚上水两道题睡觉了…
对于这道题,维护一个单调递增的队列,每次取队头元素即可…


【代码】

//洛谷 P1440m区间内的最小值#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;int n,m;int q[2000001],a[2000001],s[2000001];int main(){    int i,j,k;    scanf("%d%d",&n,&m);    for(i=1;i<=n;i++)      scanf("%d",&a[i]);    printf("0\n");    int h=1,t=0;    for(i=1;i<n;i++)    {        while(h<=t && a[q[t]]>=a[i])          t--;        t++;        q[t]=i;        while(q[t]-q[h]+1>m) h++;        printf("%d\n",a[q[h]]);    }    return 0;}
1 0
原创粉丝点击