• 一本通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
  • 相关阅读:
    【POJ】3243 Clever Y
    【BZOJ】3916: [Baltic2014]friends
    【URAL】1960. Palindromes and Super Abilities
    【BZOJ】3621: 我想那还真是令人高兴啊
    【BZOJ】2286: [Sdoi2011消耗战
    【POJ】2891 Strange Way to Express Integers
    鬼畜的多项式
    【CF】438E. The Child and Binary Tree
    【BZOJ】3456: 城市规划
    【POJ】1811 Prime Test
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10371846.html
Copyright © 2020-2023  润新知