[OI]操作ツリー

一般的にこれらの問題を作るために使用されるオペランドは、列、取り消した操作の数に追加します。

 

スタートが空のシーケンスであるとし、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 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/dudujerry/p/11619014.html