バランスの取れたラインナップのPOJ - 3264

毎日搾乳のために、ファーマージョンの  Nの  牛(1≤  N  ≤50,000)は、常に同じ順序で並べます。ある日ファーマージョンは牛のいくつかとフリスビーのゲームを整理することを決定します。物事をシンプルに保つために、彼はゲームをプレイするために搾乳ラインナップから牛の連続した範囲がかかります。しかし、楽しみを持っているすべての牛のために、彼らは高さがあまり異なってはなりません。

ファーマージョンはリストにした  Q  (1≤  Q  ≤20万)乳牛の潜在的なグループとその高さ(1つの≤  高さ  ≤1,000,000)。各グループのために、彼は最短とグループで最も高い牛の高さの差を決定するためにあなたの助けを望んでいます。

入力

1行目:二スペースで区切られた整数、  N  および  Q 。 
行2 ..  N +1:ライン  I +1は、牛の高さである単一の整数含ま  I 
線  N +2を..  N Q +1:二つの整数  A  と  B  (1≤  A ≤  B  ≤  N )、牛の範囲を表す  A に  Bを  包括します。

出力

行1 ..  Q :各行は、応答に対応し、範囲内の最も高いと最短牛の高さの差を表す単一の整数を含んでいます。

サンプル入力

6 3 
1 
7 
3 
4 
2 
5 
1〜5 
4 6 
2 2

サンプル出力

6 
3 
0 

質問の意味:あなたは、配列の長さを与えるためには50,000を超え、その後、最小差に指定されたエリアにあなたの最大値を求めていません。

思考:要求操作のでクラス間隔、最初のセグメントツリー、この問題は、比較的単純な、第一各ツリーノードの初期化ラインセグメントの2つの値が設定されている、それぞれ、最大値と、このノードの最小値
データが大きくないので、二つの部分の評価方法を記述することができるので、最大値は、最小値を求めて、ライン上の減算を求めます。

コード:
  1の#include <cstdioを>
   2の#include <fstreamの>
   3の#include <アルゴリズム>
   4の#include <cmath>
   5の#include <両端キュー>
   6の#include <ベクトル>
   7の#include <キュー>
   8の#include < ストリング >
   9# <CStringの>含む
 10の#include <地図>
 11の#include <スタック>
 12の#include < セット >
 13の#include <sstream提供さ>
 14の#include <入出力ストリーム>
15  の#define MOD 998244353
 16  の#define EPS 1E-6
17  の#define LLロングロング
 18である の#define INF 0x3f3f3f3f
 19。 使用した 名前空間STD;
 20である 
21れる 構造体ノード
 22は 、{
 23は     // Lは左側を表し、rは右側表す
24      のint 、L、R、miザ、マサチューセッツ州
 25  
26れている };
 27ノードNO [ 500000 ];
 28  INT NUM [ 50000 ];
 29  
30  // 初期化
 31される // Kは、現在のノードの数を表し、lは現在の間隔の左端を表し、rは現在のセグメントの右側の境界を表し
32  空隙ビルド(int型 Kを、INT L、INT R&LT)
 33である {
 34は      NO [K] .L = L;
 35      NO [K] .R = R&LT;
 36      // もし最低点まで再帰
37      IF(L == R&LT)
 38である     {
 39          NO [K ]の.mi = NUM [L];
 40          NO [K] = .ma NUM [L];
 41である         戻り42である     }
 43れる     // 半分のポイント
44である     int型 MID =(L + R&LT)/ 2 ;
 45      // 再帰左側にライン
46は、      ビルド(K * 2 、L、MID)。
47      // 右線に再帰
48      ビルド(K * 2 + 1、MID + 。1 、R&LT);
 49      // 更新ノードの現在値
50      NO [K] =分の.mi(NO [K * 2 ]の.mi、NO [K * 2 + 1 ]の.mi);
 51である      NO [K] .ma = MAX(NO [K * 2 ] .ma、NO [K * 2 + 1 ] .ma);
 52である }
 53れる // 間隔を見つけます最小
54は、 INT querymi(INT K、INT L、INT R&LT)
 55  {
 56である     // 対応する層への戻り値
57      であれば(NO [k]が.L == L && NO [K] .R == R)
 58      {
 59          リターンはない[K]の.mi。
60      }
 61      // 取中值
62      int型ミッド=(NO [K] .L + NO [K] .R)/ 2 63      であれば(R <= MID)
 64      {
 65          リターン querymi(K * 2 、L、R)。
66      }
 67      他の 場合(L> MID)
 68      {
 69          リターン querymi(K * 2 + 1 、L、R)。
70      }
71である     他の
72      {
 73が         リターン分(querymi(K * 2、L、MID)、querymi(K * 2 + 1、MID + 1 、R&LT));
 74      }
 75  }
 76  // 要求間隔最大値
77  のint queryma(整数 K、INT L、INT R&LT)
 78  {
 79      // 対応する層への戻り値
80      IF(NO [K] .L L == NO && [K] .R == R&LT)
 81      {
 82          リターンNO [K]。ミリアンペア;
 83      }
 84     // 取中值
85      int型ミッド=(NO [K] .L + NO [K] .R)/ 2 86      であれば(R <= MID)
 87      {
 88          リターン queryma(K * 2 、L、R)。
89      }
 90      他の 場合(L> MID)
 91      {
 92          リターン queryma(K * 2 + 1 、L、R)。
93      }
 94      他の
95      {
 96          リターン MAX(queryma(K * 2、L、MID)、queryma(K * 2 + 1、ミッド+ 1 、R));
97      }
 98  }
 99  のint main()の
 100  {
 101      INTのQ、N。
102      のscanf(" %D%D "、&​​N、&Q)。
103      のためのINT iは= 1 ; iが<= N; I ++ 104      {
 105          のscanf(" %dの"、およびNUM [I])。
106      }
 107      ビルド(11 、N)
108      INT A、B。
109      のためのINT iは= 0 ; I <Q I ++ 110      {
 111          のscanf(" %D%D "、&​​、&B)。
112          のprintf(" %D \ n "、queryma(1、B)-querymi(1 、B))。
113      }
 114 }

 



おすすめ

転載: www.cnblogs.com/mzchuan/p/11808288.html