bzoj 3223:Tyvj 1729演劇バランスの取れたツリー

説明

 

例えば、セクションをひっくり返すことは[2,4で、オリジナルの54321の順序付けられたシーケンスで、フリップ間隔:あなたは、次の操作を提供順序付けられたシーケンスを、維持するために、(トピックのタイトルを参照)のデータ構造を記述する必要があります]、結果は52341であります 

入力

mは初期配列のn個のN、続くシーケンス(1,2 ...... N-1、nは最初の行n、 )Mは反転操作の数を表し
次の2行の各数m [L、R]データその1 <= Lを確実にするために<= R <  = N

 

出力

 

N個のデジタル出力線、変換後の元のシーケンスm回の結果を示します 

 

サンプル入力

5 3

1 3

1 3

1 4

サンプル出力

4 3 2 1 5

ヒント

 



N、M <= 100000

 
バランスのとれた木の演習は、二つの方法この問題があることができ、スプレイとFHQ treapは、私が書いたFHQ treap 
 
1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、 
3  int型 CONST N = 100000 + 10 4  int型の CH [N] [ 2 ]、TG [N]、根、N、M、和、ヴァル[N]、SZ [N]キー、[N]。  
5  int型の MR(int型V){
 6      INT X = ++和; valは[X] = V;をch [X] [ 0 ] = CHを[X] [ 1 ] = TG [X] = 0 ;キー[X] =ランド(); SZ [X] = 1リターンのx;  
7  }
 8  ボイド更新(int型X){
 9     SZ [X] = SZ [CH [X] [ 0 ] + SZ [CH [X] [ 1 ]] + 1 10  }
 11  空隙 PUSHD(INT X){
 12      であれば(!X)のリターン; 
13      であれば(TG [X]){
 14の          TG [X] ^ = 1 ;   
15          スワップ(CH [X] [ 0 ]、CH [X]を[ 1 ])。  
16の          TG [CH [X] [ 0 ]] ^ = 1 ;  
17の          TG [CH [X] [ 1 ] ^ = 1 ;   
18      }
 19  }
20  INTのマージ(int型のx、int型のY){
 21      PUSHD(X)。PUSHD(Y)。  
22      もし(!X || y)のリターンのx + yの。  
23      であれば(キー[X] < キー[Y]){
 24個の          CH [X] [ 1 ] =マージ(CH [X] [ 1 ]、Y)。  
25          更新(X)リターンのx;  
26      } {
 27          CH [Y] [ 0 ] =マージ(X、CH [Y] [ 0 ])。 
28          更新(Y)。返すyと。  
29     }
 30  }
 31  空隙スプリット(int型、今のint kは、INT&X、INTY){
 32      であれば、X = Y =(今!)0 33      {
 34          PUSHD(今)。  
35          もし(K <= SZ [CH [今] [ 0 ]) 
 36              、Y =今、スプリット(CH [今] [ 0 ]、K、X、CH [Y] [ 0 ])。  
37          他の 
38              のx =今、スプリット(CH [今] [ 1 ]、K-SZ [CH [今] [ 0 ]] - 1、CH [X] [1 ]、Y)。 
39          更新(今)。 
40      }
 41  }
 42の 空隙 DFS(INT X){
 43      であれば(X!)リターン44      PUSHD(X)。 
45の      DFS(CH [X] [ 0 ])。
46      であれば(!ヴァル[X] = 0!&&ヴァル[X] = N + 1)のprintf(" %dの" 、ヴァル[X])。  
47の      DFS(CH [X] [ 1 ])。  
48  }
 49  int型のmain(){
 50      のscanf(" %D%D"、&​​N、&M);  
 51      のためにint型 i = 0 ; iが<= N + 1 ; iが++ 52          ルート= マージ(根、MR(I));  
 53      ながら(M-- ){
 54          のint L、R 、X、Y、Z、  
 55          のscanf(" %dの%のD "、&​​L&R)、
 56          分割(ルート、R + 1 、x、y)は、  
 57          分割(X、L、X、Z);  
 58          TG [Z] ^ = 1 ;  
 59          ルート= 併合(マージ(X、Z)、Y);      
 60     }
 61の     DFS(ルート)。  
62      リターン 0 ; 
63 }
コードの表示

 

 

例えば、セクションをひっくり返すことは[2,4で、オリジナルの54321の順序付けられたシーケンスで、フリップ間隔:あなたは、次の操作を提供順序付けられたシーケンスを、維持するために、(トピックのタイトルを参照)のデータ構造を記述する必要があります]、結果は52341であります 

おすすめ

転載: www.cnblogs.com/ZJXXCN/p/11455100.html