洛谷 P2032 扫描

https://www.luogu.org/problemnew/show/P2032

 

为啥不用STL,多方便。

定义一个大根堆,里边放一对数,这个数的大小和位置。

我们对于每次查询,判断首元素的位置是否在[i-k+1,i]这个范围内,不符合的话就弹出来。

代码好写。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
#define mp make_pair
typedef pair <int,int> pill ; 
priority_queue <pill,vector<pill>,less<pill> > Q;
int n,m,k,a[2000006];
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        Q.push(mp(a[i],i)); 
        if(i>=k)
        {
            while(Q.top().second<=i-k)Q.pop();
            printf("%d\n",Q.top().first);
        }
    }
}

 

posted @ 2018-09-19 15:50  Manjusaka丶梦寒  阅读(153)  评论(0编辑  收藏  举报