单调队列,有一点疑问求助
查看原帖
单调队列,有一点疑问求助
516420
Moyyer_suiy楼主2022/10/11 19:26
#include<bits/stdc++.h>
const int N = 1000010;
using namespace std;
int n, k, a;
struct s{
    int v, num;
};
deque <s> q1, q2;
int ans1[N], ans2[N];

int main(){
    cin>> n>> k;
    s q;
    for(int i = 1; i <= n; i ++){
        cin>> a;
        q.v = a;
        q.num = i;

        while(!q1.empty() && a <= q1.back().v) q1.pop_back();
        q1.push_back(q);
        if(q1.front().num + k <= i) q1.pop_front();

        while(!q2.empty() && a >= q2.back().v) q2.pop_back();
        q2.push_back(q);
        if(q2.front().num + k <= i) q2.pop_front();
        
        if(i >= k){
            ans1[i - k + 1] = q1.front().v;
            ans2[i - k + 1] = q2.front().v;
        }
    }
    for(int i = 1; i <= n - k + 1; i ++) cout<< ans1[i]<<" ";
    cout<< endl;
    for(int i = 1; i <= n - k + 1; i ++) cout<< ans2[i]<<" ";
    return 0;
}

用双端队列做的,写着写着有点不太理解,为什么21和22行,以及25和26行不能换一下前后顺序,即为什么不可以先把滑出窗口的弹出去然后再将新元素压进来呢?

上面贴的这个代码是对的,然后换一下顺序就不对了,脑子有点绕不过弯不是特别能理解,来求大佬解释一下谢谢!

2022/10/11 19:26
加载中...