パーティションツリーラインを構築するための時間である時間を考慮し、線形ベースバンド欠失である、いくつかのために、間隔は対応するセグメントツリーノードレコード次いで、この数を彼の[L、R]を得時間があります。最後にリーフノードを解決し、ツリーラインをDFS。
しかし、私はTに開始した私は、各番号[1、n]のために、もう一度再DFSあるので、時間がより複雑につながっています。実際には、グループ内のDFSに渡す線形パラメータであってもよいです。
1 // 少ないため、時間によって構築された時間セグメントツリーのパーティションを考慮し、時間間隔は彼の[L、R]、この番号、対応するセグメントツリーノードのレコードを取得されています。最後にリーフノードを解決し、ツリーラインをDFS。 2の#include <入出力ストリーム> 。3の#include <cstdioを> 4の#include <ベクトル> 5の#include <地図> 6。 使用した 名前空間STD; 7 int型 N-、A [ 500 010 ]; 8地図< 整数、整数 > Lは、R 9 構造体XXJ 10 { 11 のint B [ 33である]; 12である ボイドクリア(){ 用(INT I = 0;私は<= 32 ; iは++)[i]は= B 0 ;} 13 BOOLイン(INT X) 14 { 15 のための(int型のI = 31 ; I> = 0 ; i-- ) 16 であれば(X&(1 << I)) 17 { 18 であれば([I]){BのB [I] = xで!。ブレーク;} 19 他 X ^ = B [i]は、 20 } 21 であれば(x)をリターン 1 。 22 他の リターン 0 ; 23 } 24 INT findmax() 25 { 26 INT ANS = 0 。 27 のためには、(int型私は= 31、I> = 0 ; i-- ) 28の ANS = MAX(ANS、ANS ^ B [I])。 29の リターンANS; 30 } 31 } ANS [ 500010 ]。 32 構造体ツリー 33 { 34 のint L、R。 35 ベクトル< int型 > 合計; 36 の#defineL(x)はT R [X] .L 37 の#define R(x)はT R [X] .R 38 の#define SUM(x)はTR [X] .SUM 39 } TR [ 3000010 ]。 40 int型のCNT、根; 41 42 のintビルド(int型 L、INT R) 43 { 44 INT今= ++ CNT。 45 であれば(L == R)戻りCNT。 46 INT半ば=(L + R)>> 1 。 47 L(今)= ビルド(L、MID)。 48 R(現在)=ビルド(MID + 1 、R)。 49 戻る今; 50 } 51 空隙追加(int型 L、int型の R、int型の L、INT R、int型のx、int型Z) 52 { 53 であれば(L == R){SUM(x)は.push_back(Z)。返す;} 54 場合(L> = L && R <= R){SUM(x)は.push_back(Z)。リターン;} 55 INT半ば=(L + R)>> 1 。 56 であれば(L <= (L、R、L、中、L(x)は、Z)を追加MID)。 57 場合(R> MID)(L、R、中間+追加1 、R、R(x)は、Z)。 58 } 59の 空隙 DFS(int型のx、int型の L、INT R) 60 { 61 のために(int型 i = 0 ; iは、合計<(X).size(); I ++ ) 62 のための(INT J = L; J <= R。 J ++ ) 63の ANS [J]の.ins(SUM(x)は[I])。 64 であれば(L == R)のリターン; 65 INT半ば=(L + R)>> 1 。 66の DFS(L(x)は、L、MID)。 67の DFS(R(x)は、中間+ 1 、R)。 68 } 69 (メイン符号付き) 70 { 71 // freopenは( "in.txt"、 "R"、STDIN)。 72 73 CIN >> N。 74 のためには、(int型 i = 1 ; iがn = <; iは++ ) 75 { 76 CIN >> [I]。 77 であれば([I] < 0)R [-a [I] = I- 1 。 78 他 L [I] = I。 79 } 80 ルート=ビルド(1 、N) 81 のために(int型 I = 1を iが++; iが<= N ) 82 もし([I]> 0 ) 83 追加(L [I]、R [I]] == 0 N:R [I]、1 、nは、根、[I ]); 84の DFS(ルート、1 、N) 85 のためには、(int型 i = 1 ; iがn = <iは++ ) 86 のprintf(" %Dを\ n " 、ANSを[I] .findmax())。 87 }