滑动窗口-洛谷T1866(单调队列)

咕咕咕

单调队列板子题

 

一、基本

1.单调队列:

特殊的双端队列,内部元素。分为最大队列(单调递增)和最小队列(单调递减)两种

 

二、应用

本题中:大部分单调队列优化的动态规划问题都和定长连续子区间的最值问题

 

#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;
}
裸题

 

转载于:https://www.cnblogs.com/darlingroot/p/11355781.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值