单调队列C++(Acwing)

单调队列C++(Acwing)_第1张图片

单调队列C++(Acwing)_第2张图片

单调队列C++(Acwing)_第3张图片

单调队列C++(Acwing)_第4张图片

单调队列C++(Acwing)_第5张图片

单调队列C++(Acwing)_第6张图片

单调队列C++(Acwing)_第7张图片

单调队列C++(Acwing)_第8张图片

代码:

#include 

using namespace std;

const int N = 1000010;

int n, k;
int a[N], q[N];

int main()
{
    scanf("%d%d", &n, &k);
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    
    int hh = 0, tt = -1;
    for(int i = 0; i < n; i++)
    {
        //判断队头是否已经滑出窗口
        if(hh <= tt && i - k + 1 > q[hh]) hh++;
        while(hh <= tt && a[q[tt]] > a[i]) tt--;
        q[++tt] = i;  
        if(i >= k - 1) printf("%d", a[q[hh]]);
    } 
    puts("");
    
    hh = 0, tt = -1;
    for(int i = 0; i < n; i++)
    {
        //判断队头是否已经滑出窗口
        if(hh <= tt && i - k + 1 > q[hh]) hh++;
        while(hh <= tt && a[q[tt]] <= a[i]) tt--;
        q[++tt] = i;  
        if(i >= k - 1) printf("%d", a[q[hh]]);
    } 
    puts("");
    
    return 0;
}

你可能感兴趣的:(c++,算法,数据结构)