トピック住所: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] + 1、1); //が挿入され得る場所 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 }