zoukankan      html  css  js  c++  java
  • P1886 滑动窗口

    题目描述

    现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

    例如:

    The array is [1 3 -1 -3 5 3 6 7], and k = 3.

    输入输出格式

    输入格式:

    输入一共有两行,第一行为n,k。

    第二行为n个数(<INT_MAX).

    输出格式:

    输出共两行,第一行为每次窗口滑动的最小值

    第二行为每次窗口滑动的最大值

    输入输出样例

    输入样例#1:
    8 3
    1 3 -1 -3 5 3 6 7
    输出样例#1:
    -1 -3 -3 -3 3 3
    3 3 5 5 6 7

    说明

    50%的数据,n<=10^5

    100%的数据,n<=10^6

    单调队列维护最大最小值

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 const int MAXN=10000001;
     7 int read(int & n)
     8 {
     9     char c='.';int x=0,flag=0;
    10     while(c<'0'||c>'9')
    11     {
    12         c=getchar();
    13         if(c=='-')flag=1;
    14     }
    15     while(c>='0'&&c<='9')
    16     {
    17         x=x*10+(c-48);
    18         c=getchar();
    19     }
    20     if(flag==1)n=-x;
    21     else n=x;
    22 }
    23 int n,m;
    24 int a[MAXN];
    25 int q[MAXN],p[MAXN],h=0,t=0;
    26 void find_min()
    27 {
    28     h=1;t=0;
    29     for(int i=1;i<=n;++i)
    30     {
    31         
    32         while(h<=t&&q[t]>=a[i])
    33             t--;
    34         q[++t]=a[i];
    35         p[t]=i;
    36         while(p[h]<=i-m)
    37             h++;
    38         if(i>=m)
    39             printf("%d ",q[h]);
    40     }
    41     printf("
    ");
    42 }
    43 void find_max()
    44 {
    45     h=1;t=0;
    46     memset(q,0,sizeof(q));
    47     memset(p,0,sizeof(p));
    48     for(int i=1;i<=n;++i)
    49     {
    50         while(h<=t&&q[t]<=a[i])
    51             t--;
    52         q[++t]=a[i];
    53         p[t]=i;
    54         while(p[h]<=i-m)
    55             h++;
    56         if(i>=m)
    57             printf("%d ",q[h]);
    58     }
    59     printf("
    ");
    60 }
    61 int main()
    62 {
    63     read(n);read(m);
    64     for(int i=1;i<=n;i++)
    65         read(a[i]);
    66     find_min();
    67     find_max();
    68     return 0;
    69 }
  • 相关阅读:
    CentOS7.5 搭建MyCat1.6.6
    idea快速搭建springboot项目
    MySQL存储过程中变量及循环的使用
    windows 安装 jdk1.8并配置环境变量
    CentOS7.5安装JDK1.8
    CentOS7.2安装MySql5.7并开启远程连接授权
    PHP高级工程师面试
    每日英语
    静态化
    php分页实例及其原理
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7041125.html
Copyright © 2011-2022 走看看