Sliding window - Los Valley T1866 (monotone queue)

Gugu Gu

Monotonous queue board questions

 

First, the basic

Monotone queue:

Special deque, the internal elements. Divided maximum queue (monotonically increasing) and the minimum queue (monotonically decreasing) in two

 

Second, the application

In this problem: most monotonous queue optimization of dynamic programming problems and fixed-length continuous subinterval most value problem

 

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int sum = 0,p = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
            p = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        (sum *= 10) += ch - '0';
        ch = getchar();
    }
    return sum * p;
}

const int N = 1e6 + 5;
int n,k,head,tail;
int a[N],fn[N],fx[N],num[N],q[N];

void dpmin()
{
    head = 1,tail = 0;
    for(int i = 1;i <= n;i++)
    {
        while(num[head] < i - k + 1 && head <= tail)
            head++;
        while(a[i] <= q[tail] && head <= tail)
            tail--;
        num[++tail] = i;
        q[tail] = a[i];
        fn[i] = q[head];
    }
}

void dpmax()
{
    head = 1,tail = 0;
    for(int i = 1;i <= n;i++)
    {
        while(num[head] < i - k + 1 && head <= tail)
            head++;
        while(a[i] >= q[tail] && head <= tail)
            tail--;
        num[++tail] = i;
        q[tail] = a[i];
        fx[i] = q[head];
    }
}

int main()
{
    n = read(),k = read();
    for(int i = 1;i <= n;i++)
        a[i] = read();
    dpmin();
    dpmax();
    for(int i = k;i <= n;i++)
        printf("%d ",fn[i]);
    printf("\n");
    for(int i = k;i <= n;i++)
        printf("%d ",fx[i]);
    return 0;
}
Naked title

 

Guess you like

Origin www.cnblogs.com/darlingroot/p/11355781.html
Recommended