滑动窗口 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;
}
全部评论

相关推荐

06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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