滑动窗口——优先队列写法

P1886 滑动窗口 /【模板】单调队列

思路:

记录两个元素分别是元素值元素下标

因为元素下标不会过期, 所以可以用STL优先队列(priority_queue)。

分为一个升序的优先队列,降序的优先队列,每次看队首如果过期了就删掉,否则答案就是队首。

优先队列传送门

【原创】优先队列 priority_queue 详解-优快云博客

代码:

#include <bits/stdc++.h>
using namespace std;
struct Windows{
    int x, id;
    bool operator < (const Windows &T) const { return x < T.x; }
    bool operator > (const Windows &T) const { return x > T.x; }
};
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int n, k;
    cin >> n >> k;
    priority_queue<Windows> Q; // 最大
    priority_queue<Windows, vector<Windows>, greater<Windows>> Qless; // 最小
    vector<Windows> A(n);
    for (int i = 0; i < n; i++) cin >> A[i].x, A[i].id = i;
    for (int i = 0; i < n; i++) {
        Qless.push(A[i]);
        while(Qless.top().id <= i - k) Qless.pop(); // 过期
        if (i >= k - 1) cout << Qless.top().x << ' ';  
    }
    cout << '\n';
    for (int i = 0; i < n; i++) {
        Q.push(A[i]);
        while(Q.top().id <= i - k) Q.pop(); // 过期 
        if (i >= k - 1) cout << Q.top().x << ' ';
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值