一般的にこれらの問題を作るために使用されるオペランドは、列、取り消した操作の数に追加します。
スタートが空のシーケンスであるとし、3つの動作があります
(1)列の数を加えた数の後
(2)中央位置の列の数を決定
(3)アンドゥ操作オフ回数が最後の実行(1及び3)
現在のノードのルートノードから位置Kに比べて列の位置値kは、ノード2つのオペランドが評価され、ノードの動作が新たに現在のノードで添加し、ツリーの構築を検討
操作のうち3は、最後の操作がバックk番目のノードkで行い、バックトラック後にバックトラックする前に、現在のノードと現在のノードを記録した元に戻します。
だから、すべての時間は、クエリ、彼の父を見つけるために、現在のノードから始めて、距離を照会するノードに現在のノードを取得し-kノードの数、ノード数を記録し、ルートノードを検索してきました。
元に戻すまでの時間は、父ノードは、彼の父親を見つけるまでに動作している、彼の父親は、ノードを動作していたことはバック3操作の前に「現在のノード」という3にジャンプ
この質問など:
- 合計時間制限:
- 10000ms
- 制限時間内の単一のテストポイント:
- 1000ミリ秒
- メモリの制限:
- 262144kB
- 説明
-
M操作と空の列の数に、各操作を3のいずれかです。
(1)列の数を加えた数の後
(2)中央位置の列の数を決定
(3)アンドゥ操作オフ回数が最後の実行(1及び3)
- エントリー
-
正の整数Mの最初の行
次のM行は、各列は、文字が「A」である場合、それは、加算演算、次の整数xを示している列の数を加えた整数xを表し、文字の先頭にある文字は「Q」である場合、それは次の整数、X、Xは、評価位置を表し、クエリ動作を示し、文字は「U」である場合、それは、アンドゥ操作、次の整数xを表し、最後の操作を数回行う失効を表します。 - 輸出
- 答えを表し、個々の出力ラインのオペレーターに要求します。
- サンプル入力
-
9 1 A 2 A 3 Q 3 U 1 A 4 Q 3 U 2 Q 3
- サンプル出力
-
3 4 3
- プロンプト
- 1 <= M ^ 5 <= 10、有効な入力を確保するために、すべての利用可能な32ビット整数の整数として格納されて署名しました。
書式#include <cstdioを> する#include <iostreamの> のconst int型 MAXN = 100001 ; int型FA [MAXN]。 // BOOLエッジ[MAXN] [MAXN]。int型のn; INT V [MAXN]。 int型バック[MAXN]。INT メイン() { scanf関数(" %のD "、&N)int型のnow_node。文字XX; std :: cinを >> XX。 int型XX。 scanf関数(" %のD "、&XX)。 now_node = 1 。 int型 node_cnt = 1 ; V [node_cnt] =のXX。 用(int型、L = 2、L <= N; L ++ ){ チャーX。 std :: cinを >> X; もし(X == ' A ' ){ int型NX。 scanf関数(" %のD "、およびNX)。 V [ ++ node_cnt] = NX。 FA [node_cnt] = now_node。 // エッジ[now_node] [node_cnt] = 1。 now_node =node_cnt; } そう であれば(X == ' U ' ){ int型NX。 scanf関数(" %のD "、およびNX)。 int型 last_node = now_node。 以下のために(int型 I = 1 ; I <= NX; iは++ ){ 場合(!背面[now_node]) now_node = FA [now_node]。 他 now_node = バック[now_node]。 } バック【now_node] =last_node。 } そう であれば(X == ' Q ' ){ int型NX。 scanf関数(" %のD "、およびNX)。 int型のカウント= 0 ; int型 TMP = now_node。 一方、(1 ){ 場合(!FA [TMP]){ 破ります。 } TMP = FA [TMP]。 カウント ++ ; } 数 =カウント- NXと、 TMP = now_node。 以下のために(int型 I = 1 ; I <=カウント; iは++ ){ TMP = FA [TMP]。 } のprintf(" %d個の\ n " 、V [TMP])。 } } 戻り 0 。 }