<span>POJ2823 Sliding Window(单调队列模版题)</span>

题目描述:有N个数,每次从左到右选取M个数,第一行选取每个区间中的最小值输出,第二行选取最大值并输出。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define M 1000005
int n,k,a[M],n1[M],n2[M];
void init()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
}
void makemin()
{
    int head=0,end=0;
    for(int i=0;i<k;i++)
    {
        while(end>head&&a[i]<=n1[end-1])
            end--;
        n1[end]=a[i];
        n2[end]=i;
        end++;
    }
    for(int i=k;i<n;i++)
    {
        printf("%d ",n1[head]);
        while(head<end&&n2[head]<=i-k)
            head++;
        while(end>head&&a[i]<=n1[end-1])
            end--;
        n1[end]=a[i];
        n2[end]=i;
        end++;
    }
    printf("%d\n",n1[head]);
}
void makemax()
{
    int head=0,end=0;
    for(int i=0;i<k;i++)
    {
        while(end>head&&a[i]>=n1[end-1])
            end--;
        n1[end]=a[i];
        n2[end]=i;
        end++;
    }
    for(int i=k;i<n;i++)
    {
        printf("%d ",n1[head]);
        while(head<end&&n2[head]<=i-k)
            head++;
        while(end>head&&a[i]>=n1[end-1])
            end--;
        n1[end]=a[i];
        n2[end]=i;
        end++;
    }
    printf("%d\n",n1[head]);
}
int main()
{
    //freopen("in.txt","r",stdin);
    init();
    makemin();
    makemax();
    return 0;
}

 

全部评论

相关推荐

2024-12-26 13:00
太原理工大学 Java
会飞的猿:简历没啥大问题啊,感觉是缺少了实习经历。多投投先找个中小厂过渡一下吧
点赞 评论 收藏
分享
2024-12-27 23:45
已编辑
三江学院 Java
程序员牛肉:死局。学历+无实习+项目比较简单一点。基本就代表失业了。 尤其是项目,功能点实在是太假了。而且提问点也很少。第一个项目中的使用jwt和threadlocal也可以作为亮点写出来嘛?第二个项目中的“后端使用restful风格”,“前端采用vue.JS”,“使用redis”也可以作为亮点嘛? 项目实在是太简单了,基本就是1+1=2的水平。而你目标投递的肯定也是小厂,可小厂哪里有什么培养制度,由于成本的问题,人家更希望你来能直接干活,所以你投小厂也很难投。基本就是死局,也不一定非要走后端这条路。可以再学一学后端之后走测试或者前端。 除此之外,不要相信任何付费改简历的。你这份简历没有改的必要了,先沉淀沉淀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务