POJ-2828チケットを購入(木ライン、キューイング問題、思考リバース)

トピック住所:POJ 2828チケットを購入

 

説明

鉄道チケットは、中国の旧正月を中心に買いが困難であったので、私たちは早起きし、長い行列に参加する必要があります...

旧正月が近づいていたが、運悪くリトルキャットはまだ持っていたスケジュールがあちこちに行きます。今、彼は情報でオリンピックの代表チームの冬のキャンプの選択のための綿陽市、四川省に電車で移動しなければなりませんでした。

これは、1つ時には午前と暗い外でした。北西からの冷たい風がキューに人々を追い払うませんでした。寒い夜には小さな猫に震えを与えました。なぜ考える問題を探してみませんか?それは凍死未満良くどれもなかったです!

人々は、キューをジャンプし続けました。それは周りの暗すぎたので、そのような動きはしても、キュー・ジャンパに隣接した人々によって発見されません。「キュー・ジャンプが与えられた後、彼らは、私は、キュー内の人々の最終命令を見つけることができ、スタンドどこキュー内のすべての人がキューをジャンプしている人たちについての積分値と、すべての情報が割り当てられている場合は?」と思いました子猫。

入力

入力にはいくつかのテストケースがあります。各テストケースは、から成る  N  + 1行  Nが  (1≤  N  20万≤)テストケースの最初の行に示されています。次の  N個の  行は、値の対含有  順位I  および  ヴァルのI  の増加順に  I(1≤  iは  ≤  Nを)。それぞれについて  I、範囲及び意味の  順位は、I  及び  ヴァル私は  以下の通りです。

  • 順位iの  ∈[0、  I  - 1] -  番目の人はキューに来て、右の後ろに立っていた  順位iのキューに人を目。予約オフィスはキューの最初の人と考えられていたキューの先頭に0番目の人と人と考えられていました。
  • ヴァルiが  [32767、0]∈ -  I番目の人は、値に割り当てられた  ヴァルI

そこのテストケースの間には空白行。入力の最後に進みます。

出力

各テストケースの場合、出力彼らはキューに立つために、人々の価値あるスペースで区切られた整数の一行。

サンプル入力

4 
0  77 
1  51 
1  33 
2  69 
4 
0  20523 
1  19243 
1  3890 
0  31492

サンプル出力

77  33  69  51 
31492  20523  3890  19243

ヒント

下図は、リトルキャットはサンプル入力の最初のテストケースで説明したキューの人々の最終命令を発見する方法を示します。

 

質問の意味: 
キューをジャンプするときのチケットのためにキューに入れ。 
挿入し、彼のval_iたいpos_i人の位置を表すいくつかの数のペアを付け、valがキューの最後の順序を取得しました。

分析: 
これは非常に巧妙なタイトルです。 

固定された人物の位置の最終位置に挿入され、観察された、我々は後方から挿入することができ、POSは、ヴァルvalがPOSフロント位置posに取っておくこと、次に、代表的な位置posに挿入されます、

私たちは、それが決定されると、位置の背後にある人々は変更されませんステーションの背面から開始する、の反対を考えることができ、および仮定の人々が適切な場所の後ろに立っている、そして時にその人ステーション、現在位置限り、番号numのスペースとして、背面にすでにある人、それは個々のステーションの位置を決定することができます。

例えば、crazy_appleの例では、謝〜

POSを挿入する逆この段落の隙間に格納され、セグメントツリーのノード番号:

    例えば:77 0
         1 51は
         1〜33である。
         2 69

  最初のテイク:2 69 - - -69- - (フロント挿入口3に必要)

       次に取る:1 33 --- 33--69 ---(2つのフロントスペースを挿入するために必要な)

       次に取る:151 --- 33--69- -51-(2つのギャップは正面挿入する必要があります)後方空間にフロントのみギャップよう

  次に取る:0 77-77--33--69- -51-(挿入するために必要なスペースの前に)

 

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include <iostreamの>
 4の#include < ストリング >
 5の#include <math.h>の
 6の#include <アルゴリズム>
 7の#include <キュー>
 8#含む< 設定 >
 9の#include <math.h>の
 10  のconst  int型 INF = 0x3f3f3f3f 11 typedefの長い 長いLL。
12  のconst  int型 MAXN = 2E5 + 10 13  使って 名前空間をSTD;
 14  
15  INT N-;
 16  INT加える[MAXN << 2 ]; // ギャップの数
。17  int型の POS [MAXN]; // 挿入位置
18である INTヴァル[MAXN]; // 初期値
19  のint ANSの[ MAXN]; // 最終ステーション
20は 
21である ボイドビルド(int型 L、int型の R&LTは、INT RT)
 22は 、{
 23が      追加[RT]はL-R&LTの+ = 1 ; // ギャップの最初の数
24      IF(L == R&LT)
 25         戻り;
 26は、     INT、M =(L + R&LT)>> 1。;
 27      ビルド(L、M、RT << 1。);
 28      ビルド(第m + 1、R&LT、RTを<< 1 | 1 ); 
 29  }
 30  
31であり、 int型の更新(int型の L、int型の R&LT、INT NUM、INT RT)// NUM中断が空孔の数の前に必要とされる
32  {
 33が      追加[RT] - ; // 。ギャップの数保存1 
34は、     IF(L == R&LT)
 35          リターン L; // 挿入位置を返します
36      のint =(L + R&LT)>> M 1 ;
 37      IF(ADD [RT << 1。 ]> = NUM)// 以上挿入の挿入位置の左側に等しい左の子にスペース場合
38である          更新(L、M、NUM 、RT << 1。);
 39      // 数が正しい挿入、空間左ブランクNUM未満である場合、マイナスの左側に挿入されるNUM右位置
40      {
 41が          NUM-ADD = [RT << 1。];
 42で          更新(M + 。1、R&LT、NUM、RT << 1 | 1 );
 43である     }
 44である }
 45  
46であり、 INT (メイン)
 47  {
 48      ながら(〜scanfの(" %のD "、およびN-))
 49      {
 50          ビルド(1、N-、1。);
 51である         ためINT I = 1 ; I <= N-Iが++ 52である         {
 53は              scanfの(" %のDの%D "、&​​POS [I]、&ヴァル[I]);
 54である         }
 55          のためにINT I = N-; Iは> = 1 ; i--)// 更新逆に、最後の位置を決定することができる
56である         {
 57が             INTキー更新=(1、N-、POS [I] + 11); //が挿入され得る場所
58の              ANS [キー]ヴァル= [I]; // 格納されたANSアレイ
59          }
 60          のためにINT I = 1 ; I <= N; ++ I 61は         、{
 62は             IF(I =!1。 63である                  (printfの"  " );
 64              のprintf(" %のD " 、ANS [I]);
 65          }
 66          のprintf(" \ N- " );
 67     }
 68      リターン 0 69 }

 

おすすめ

転載: www.cnblogs.com/jiamian/p/11281076.html