• P1886 滑动窗口


    题目链接:https://www.luogu.org/problem/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

    解题思路:题目不难可以使用线段树,RMQ等方法解题,这里使用了单调队列。单调队列,顾名思义就是具有单调性的队列,每次更新时往队尾插入,取出时用队首就好了。这里介绍一篇博客供参考吧。

    单调队列:https://www.cnblogs.com/hanruyun/p/9614115.html

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+5;
    struct st{
    	int val,pos;
    }que1[maxn];
    int tail,head;
    int a[maxn];
    int main(){
    	int n,k;
    	int tem;
    	scanf("%d%d",&n,&k);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    	}
    	head=1;
    	tail=0;
    	for(int i=1;i<=n;i++){
    		while(head<=tail&&i-que1[head].pos>=k)head++;
    		while(head<=tail&&que1[tail].val>=a[i])tail--;
    		que1[++tail].val=a[i];
    		que1[tail].pos=i;
    		if(i>=k){
    			printf("%d ",que1[head].val);
    		}
    	}
    	printf("
    ");
    	head=1;
    	tail=0;
    	for(int i=1;i<=n;i++){
    		while(head<=tail&&i-que1[head].pos>=k)head++;
    		while(head<=tail&&que1[tail].val<=a[i])tail--;
    		que1[++tail].val=a[i];
    		que1[tail].pos=i;
    		if(i>=k){
    			printf("%d ",que1[head].val);
    		}
    	}
    	printf("
    ");
    	return 0;
    } 
    

      

  • 相关阅读:
    Linux centos7修改根目录
    gitlab的安装
    windows上svn图标不显示 绿色对号
    java中的Serializable接口
    List Map Set的线程安全
    javascript中的each遍历
    jdk 1.7新特性
    jdk 1.6 新特性
    jdk1.5 新特性
    java 运算符
  • 原文地址:https://www.cnblogs.com/Zhi-71/p/11740914.html
Copyright © 2020-2023  润新知