セクションのウィンドウモノトーンキュー最大の価値をスライディング

説明

サイズの配列 のn ≤10 6は、 あなたに与えられています。サイズのスライディングウィンドウあり 、K は非常に右にアレイの非常に左から移動しています。あなただけ見ることができる k個の ウィンドウの中の数字を。各時間は、スライディングウィンドウが一つの位置によって右に移動します。次の例である:
配列である [1 3 -1 -3 5 3 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

あなたの仕事は、各位置のスライディングウィンドウ内の最大値と最小値を決定することです。

入力

入力は2行で構成されています。最初の行は二つの整数含ま のn 及び kの アレイとスライディングウィンドウの長さです。ある n個の 2行目の整数。

出力

出力に2つのラインがあります。最初の行は、それぞれ、左から右へ、各位置でのウィンドウ内の最小値を与えます。2行目は、最大値を与えます。

サンプル入力

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

サンプル出力

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

ソース

************************************************** ************************************************** ***********************

単調キューは、インターバルの中で最も値を求める(ただし、固定長の複数のセクション)

************************************************** ************************************************** ***********************

1の#include <iostreamの>
 2の#include < ストリング >
 3の#include <CStringの>
 4の#include <cmath>
 5の#include <cstdioを>
 6の#include <アルゴリズム>
 7  使って 名前空間STD。
8  INT [ 1000001 ]。
9  int型 QUE [ 100000001 ]。
10  int型N、K。
11  ボイド MIN()// 单调递增求最小值
12  {
 13      INTヘッド= 1、尾= 0 14     int型、それを。
15      のためには、(それが= 0 ;それ<K- 1 ;それ++ 16      {
 17          ながら(ヘッド<=尾&& [QUE [尾]]> = [それ])tail-- 18          尾++ ;
19          QUE [テール] = それを、
20      }
 21      のために(それはK-= 1をそれ++;それ<N 22      {
 23          ながら(ヘッド<=尾&& [QUE [尾]]> = [それ])tail--します24          尾++ ;
25          QUE [テール] = それを、
26          しばらく(QUE【ヘッド<IT-K + 1)ヘッド++ ;
 27          のprintf(" %のD " 、A [QUE [頭部]]);
 28          のprintf(" %のC "、((IT == N- 1)?' \ N- ''  ' ));
 29  
30      }
 31である }
 32  ボイド MAX()// 単調減少、最大値選択
33である {
 34が     INT =ヘッド1、尾= 0 ;
 35      int型ITを、
 36      のために(それが= 0を;それ<K- 1 ;それ++ 37      {
 38は         、一方(ヘッド<=尾&& [QUE [尾] <= [それ])tail-- 39          尾++ ;
40          QUE [テール] = それを、
41      }
 42      のために(それはK-= 1 ;それ<N;それ++ 43      {
 44は         、一方(ヘッド<=尾&& [QUE [テール] <[それ] =)tail--を45          尾++ ;
46          QUE [テール] = それを、
47          一方(QUE [ヘッド<IT-K + 1)ヘッド++ 48         printf(" %dの" 、[QUE [頭部])。
49          のprintf(" %cの"、((これは、N- == 1)?' \ nは''  ' ));
50  
51      }
 52  }
 53  のint main()の
 54  {
 55      INT I、J。
56      一方(scanf関数(" %D%dの"、&​​N&K)!= EOF)
 57      {
 58          (i = 0 ; iがn <; Iは++ 59         scanf関数(" %のD "、および[I])。
60          分();
61          MAX()。
62      }
 63      リターン 0 64  
65 }
コードの表示

 

ます。https://www.cnblogs.com/sdau--codeants/p/3450728.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34275734/article/details/93432974