zoukankan      html  css  js  c++  java
  • 一本通1597【 例 1】滑动窗口

    1597:【 例 1】滑动窗口

    时间限制: 1000 ms         内存限制: 524288 KB

    题目描述

    原题来自:POJ 2823

    给一个长度为 N 的数组,一个长为 K 的滑动窗体从最左端移至最右端,你只能看到窗口中的 K 个数,每次窗体向右移动一位,如下图:

    你的任务是找出窗体在各个位置时的最大值和最小值。

    输入格式

    第 1 行:两个整数 N 和 K
    第 2 行:N 个整数,表示数组的 N 个元素(2×109);

    输出格式

    第一行为滑动窗口从左向右移动到每个位置时的最小值,每个数之间用一个空格分开;
    第二行为滑动窗口从左向右移动到每个位置时的最大值,每个数之间用一个空格分开。

    样例

    样例输入

    8 3
    1 3 -1 -3 5 3 6 7

    样例输出

    -1 -3 -3 -3 3 3
    3 3 5 5 6 7

    数据范围与提示

    对于 20% 的数据,KN1000;
    对于 50% 的数据,KN105
    对于 100% 的数据,KN106

    sol:单调队列模板

    #include <bits/stdc++.h>
    using namespace std;
    typedef int ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-');
            ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48);
            ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-');
            x=-x;
        }
        if(x<10)
        {
            putchar(x+'0');
            return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    inline void writeln(ll x)
    {
        write(x);
        putchar('
    ');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) writeln(x)
    const int N=1000005;
    int n,m,a[N];
    struct Record
    {
        int Shuz,Weiz;
    }Ddq[N];
    int main()
    {
        int i,Head=1,Tail=0;
        R(n); R(m);
        for(i=1;i<=n;i++) R(a[i]);
        for(i=1;i<m;i++)
        {
            while(Head<=Tail&&a[i]<=Ddq[Tail].Shuz) Tail--;
            Ddq[++Tail]=(Record){a[i],i};
        }
        for(i=m;i<=n;i++)
        {
            while(Head<=Tail&&a[i]<=Ddq[Tail].Shuz) Tail--;
            Ddq[++Tail]=(Record){a[i],i};
            while(Head<Tail&&Ddq[Head].Weiz<i-m+1) Head++;
            W(Ddq[Head].Shuz);
        }
        putchar('
    ');
        Head=1; Tail=0;
        for(i=1;i<m;i++)
        {
            while(Head<=Tail&&a[i]>=Ddq[Tail].Shuz) Tail--;
            Ddq[++Tail]=(Record){a[i],i};
        }
        for(i=m;i<=n;i++)
        {
            while(Head<=Tail&&a[i]>=Ddq[Tail].Shuz) Tail--;
            Ddq[++Tail]=(Record){a[i],i};
            while(Head<Tail&&Ddq[Head].Weiz<i-m+1) Head++;
            W(Ddq[Head].Shuz);
        }
        return 0;
    }
    /*
    input
    8 3
    1 3 -1 -3 5 3 6 7
    output
    -1 -3 -3 -3 3 3
    3 3 5 5 6 7
    */
    View Code
  • 相关阅读:
    Algs4-1.1.17找出以下递归函数的问题
    Algs4-1.1.16给出exR1(6)的返回值
    Algs4-1.1.15编写一个静态方法histogram()
    Algs4-1.1.14实现以2为底的对数
    Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
    Algs4-1.1.12以下代码段会打印出什么结果?
    python将一个列表的元素随机打乱
    python 类似java的三目运算符
    java的三元运算符
    java 的Colections类(Java也有python类似列表的反转、排序等方法)
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10371846.html
Copyright © 2011-2022 走看看