【UOJ 47】滑行的窗口

【题目描述】:

给定一个长度为n的数列a,再给定一个长度为k的滑动窗口,从第一个数字开始依次框定k个数字,求每次框定的数字中的最大值和最小值,依次输出所有的这些值。下面有一个例子数组是 [1 3 1 3 5 6 7] , k 是3:

       窗口位置              窗口中的最小值   窗口中的最大值
[1  3  -1] -3  5  3  6  7            -1            3
 1 [3  -1  -3] 5  3  6  7            -3            3
 1  3 [-1  -3  5] 3  6  7            -3            5
 1  3  -1 [-3  5  3] 6  7            -3            5
 1  3  -1  -3 [5  3  6] 7             3            6
 1  3  -1  -3  5 [3  6  7]            3            7

【输入描述】:

第一行包含两个整数 n 和 k ,分别表示数组的长度和滑动窗口长度。

第二行n个整数,表示数列元素的值。

【输出描述】:

第一行从左到右窗口看到的最小值。

第二行从左到右窗口看到的最大值。

【样例输入】:

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

【样例输出】:

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

【时间限制、数据范围及描述】:

时间:1s 空间:64M

30%:n<=100 k<=20

60%:n<=5000 k<=20

100%:n<=10^6,每个元素不操过int类型

需要读入输出优化

题解:单调队列%%%

#include <iostream>
#include <cstdio>
#include <deque>
#include <cmath>
using namespace std;
deque <int> q;
deque <int> q2;
int a[1000005],mmin[1000005],mmax[1000005];
int n,k;
void putmax(int x){
    while(!q.empty()&&a[x]>a[q.back()]){
        q.pop_back();
    }
    while(!q.empty()&&x-q.front()>=k){
        q.pop_front();
    }
    q.push_back(x);
}
void putmin(int x){
    while(!q2.empty()&&a[x]<a[q2.back()]){
        q2.pop_back();
    }
    while(!q2.empty()&&x-q2.front()>=k){
        q2.pop_front();
    }
    q2.push_back(x);
}
int main ( ){
    int num=0;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        putmax(i);
        putmin(i);
        if(i>=k){
            num++;
            mmax[num]=a[q.front()];
            mmin[num]=a[q2.front()];
        }
    }
    for(int i=1;i<=num;i++){
        printf("%d ",mmin[i]);
    }
    printf("\n");
    for(int i=1;i<=num;i++){
        printf("%d ",mmax[i]);
    }
    printf("\n");
    return 0;
}

原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11192290.html

时间: 2024-10-04 16:18:05

【UOJ 47】滑行的窗口的相关文章

vc建立一个窗口的流程

上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上都会介绍,而平时我们除了会接触到纯虚函数外,其他的不多用.纯虚函数,你可以认为与C#中的抽象方法或接口中的方法类似,即只定义,不实现.好处就是多态,发何处理,由派生类来决定. 在开始吹牛之前,我先推荐一套视频教程,孙鑫老师的C++教程,共20课,我不是帮他老人家打广告,而是因为孙老师讲的课是我听过的

基础学习day11--多线程一线程的创建,运行,同步和锁

1.1.进程和线程 进程:一个应用程序一般都是一个进程,正在进行的程序 每一个进程最少都有一个线程,都有一个执行顺序,该顺序是一个执行路径或者一个控制单元 线程:进程中一个独立的控制单元,线程控制着进程的执行. windows中的任务管理器,可以查看进程,linux下通过ps命令 线程是进程的最小单位 线程依赖于进程 线程随着进程的创建和创建,随着进程的结束而消亡 如迅雷:可以同时开启多个下载,就是多线程 多个程序同时执行,时CPU在很快的切换,看上去是同时执行,实际上是在CPU在切换执行. 多

Servlet&amp;jsp基础:第四部分

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接: http://www.cnblogs.com/jiangzhengjun/p/4289315.html 会话与状态管理... 58 cookie. 58 组成... 58 Set-Cookie2响应头... 59 Cookie请求头... 60 在Servlet中使用Cookie. 61 Cookie类... 61 构

将 mp3 等音乐资源以资源形式嵌入 exe 文件中

引用:http://www.easyx.cn/skills/View.aspx?id=6 本文讲解怎样将 mp3 等音乐资源以资源形式嵌入 exe 文件中,并通过 mciSendString 调用.嵌入 mp3 和嵌入图片略有不同,将图片嵌入到 exe 中,以及访问嵌入 exe 中的图片,请参考:http://www.easyx.cn/skills/View.aspx?id=6 [一.以资源文件形式嵌入 exe] 关于"资源文件"的介绍和"将 mp3 以资源形式嵌入 exe

windows api的学习

好啦,前段时间疯玩了好久,堕落的这么久也该好好学习学习了,在接触过一大堆程序设计语言后发现还是用C++好了,毕竟看着这名字就舒坦,新手还是老老实实先在windows下开发吧.前段时间开始,照着书上抄了个最初级的"Hello Windows!",当时没想多少,今天学着无聊觉得还是带着上次写的一起写到网上来吧,以后回过头来也许还会来笑笑自己当初原来会是如此傻,好了不多说,今天姑且在原来的基础上加了一点点新东西,好吧,也就是那么一点点,下面当然就是上代码咯. 1 #include <w

线程同步(三)

介绍完如何创建进程以及线程了,那么我们接着来看一个实例: 利用多线程模拟 3 个窗口卖票   第一种方法:继承 Thread 类 创建窗口类 TicketSell ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.ys.thread;   public class TicketSell extends Thread{     //定义一共有 50 张票,注意声明为 st

Java 多线程详解(三)------线程的同步

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程:http://www.cnblogs.com/ysocean/p/6883491.html 介绍完如何创建进程以及线程了,那么我们接着来看一个实例: 利用多线程模拟 3 个窗口卖票 第一种方法:继承 Thread 类 创建窗口类 TicketSell package com.ys.thread; p

user32的使用

通过代码查询特定的窗口,并在文本框中输入文字然后单击"OK"按钮 需要查找的Dialog 使用Spy++查看窗口信息 通过代码实现功能 1 class Program 2 { 3 //define method 4 5 /// <summary> 6 /// 查找顶级窗口,如果有指定的类名和窗口的名字则表示成功返回一个窗口的句柄.否则返回零. 7 /// </summary> 8 /// <param name="lpClassName"

用 SDL2 平铺背景并显示前景

环境:SDL2 + VC++2015 下面的代码将打开background.bmp和image.bmp,将background平铺背景,将image作为前景呈现 1 #include <iostream> 2 #include "SDL.h" 3 4 //屏幕宽度 5 const int SCREEN_WIDTH = 640; 6 const int SCREEN_HEIGHT = 480; 7 8 //全局窗口和渲染器 9 SDL_Window *window = nul