zoukankan      html  css  js  c++  java
  • POJ2823 Sliding Window(单调队列模版题)

    题目描述:有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
    ",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
    ",n1[head]);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        init();
        makemin();
        makemax();
        return 0;
    }
  • 相关阅读:
    数据透视表快速按年月分组
    会计-汇兑损益账务处理
    vs Mvc晋级
    sql语句建立新表SMFIELD
    access左侧导航栏拉窄后,鼠标悬停时无法拉宽。
    SQL函数min和max用法
    转发一个很齐全的gridview应用帖子
    循环
    JavaScript的进阶学习
    JavaScript的学习
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/4734037.html
Copyright © 2011-2022 走看看