zoukankan      html  css  js  c++  java
  • 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;
    } 
    

      

  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/Zhi-71/p/11740914.html
Copyright © 2011-2022 走看看