滑动窗口 3.30

滑动窗口

http://www.nowcoder.com/questionTerminal/b4d345a65640432db06ac978ccb6e23a

单调队列模板题

每次先把已经超过范围的扔掉。

然后把范围内不可能成为最优解的扔掉。

然后入队。

很久以前写的代码:

#include<iostream>
#include<cstdio>

using namespace std;
#define maxn 10000007
int x,q[maxn],a[maxn],n,m,f,r;

inline void Init()
{
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;i++)
        scanf("%d",&a[i]);
}
inline void Work()
{
    if(m==1)
    {
        for(register int i=1;i<=n;i++)
            printf("%d ",a[i]);
        printf("\n");
        for(register int i=1;i<=n;i++)
            printf("%d ",a[i]);
        printf("\n");
        return;
    }
    q[f=++r]=1;
    for(register int i=2;i<m;i++)
    {
        x=a[i];
        while(a[q[r]]>=x&&r>=f)
            r--;
        q[++r]=i;
    }
    for(register int i=1;i+m-1<=n;i++)
    {
        while(q[f]<i)
            f++;
        x=a[i+m-1];
        while(a[q[r]]>=x&&r>=f)
            r--;
        q[++r]=i+m-1;
        printf("%d ",a[q[f]]);
    }
    printf("\n");
    q[f=r=1]=1;
    for(register int i=2;i<m;i++)
    {
        x=a[i];
        while(a[q[r]]<=x&&r>=f)
            r--;
        q[++r]=i;
    }
    for(register int i=1;i+m-1<=n;i++)
    {
        while(q[f]<i)
            f++;
        x=a[i+m-1];
        while(a[q[r]]<=x&&r>=f)
            r--;
        q[++r]=i+m-1;
        printf("%d ",a[q[f]]);
    }
    printf("\n");
}
int main()
{
    Init();
    Work();
    return 0;
}
全部评论

相关推荐

机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
05-24 14:12
门头沟学院 Java
点赞 评论 收藏
分享
07-18 18:44
已编辑
中山职业技术学院 Java
投递文远知行等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务