BZOJ4184のエシャロット

BZOJ4184のエシャロット

パーティションツリーラインを構築するための時間である時間を考慮し、線形ベースバンド欠失である、いくつかのために、間隔は対応するセグメントツリーノードレコード次いで、この数を彼の[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 }
完全なコード

 

 

おすすめ

転載: www.cnblogs.com/Al-Ca/p/11240185.html