滑动窗口

http://poj.org/problem?id=2823

题意:给出n个数,窗口大小为k,窗口从1滑到n-k,问所以窗口内的最大最小值;

#include <iostream>

using namespace std;

int a[1001000] , q[1001000] ;
int h , r ;

int main(){
    int n , m ; 
    scanf("%d%d" , &n , &m);
    for(int i = 0 ; i < n ; i ++){
        scanf("%d" , &a[i]);
    }
    int h = 1 , r = 0 ;
    for(int i = 0 ; i < n ; i ++){
        while(r >= h && a[q[r]] >= a[i]) r--;
        if(r >= h && i - q[h] >= m) h++;
        q[++r] = i;
        if(i >= m - 1) cout << a[q[h]] <<  " " ;
    }
    puts("");
    h = 1 ; r = 0;
    for(int i = 0 ; i < n ; i ++){
        while(r >= h && a[q[r]] <= a[i]) r--;
        if(r >= h && i - q[h] >= m) h++;
        q[++r] = i ;
        if(i >= m - 1) cout << a[q[h]] << " " ;
    }
    puts("");
    
}

 

posted @ 2020-02-17 15:36  无名菜鸟1  阅读(169)  评论(0编辑  收藏  举报