説明
例えば、セクションをひっくり返すことは[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
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、INT&Y){ 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であります