GERALD07強化されたバージョン:LCT、木の会長、ポイントの側

説明:図のエッジにMの無Nポイント、照会予約図ユニコムブロック[L、R]図エッジの数がナンバリング。

ポータル

 

LCTので、神のものは、問題を解決するには、行の書き方をではないでしょうか?

ああアイデアを妖精。

実際には、難しいことではないが、と考えるのは確かに簡単ではありません。

私たちは考えるもの答えはい。

まず、n個の点から始まるが、ユニコムブロックされている、そしてあなたも、いくつかのサイドユニコムブロックが減少することはできません。

どのようにそれを軽減するには?スパニングツリーの上端の間隔の数です。それは合成ブロックユニコムなしスパニングツリー、いくつかの側面上のスパニングツリーとリングの側にない場合ため。

ツリーをスパニング間隔がどのように内側に側面を決定するのではないでしょうか?これは、表側に基づいて決定され、環が形成されます。

だから最初の側面は、我々は作品の最初の側面は、これら2つのポイントに接続されていた見つかった場合でも、一緒に入れ、このエッジがエッジを発生置き換えることができます。

それは、置換基ではないのエッジ間隔、スパニングツリーで、このエッジがある場合。

だから、LCTに来る、ライン上の点の最大数の維持側は、インサートの各側面のエッジは、LST年のアレイがある前に交換することが求められます。

クエリのセットごとに、質問をすることは、いくつかの[L、R]内で、L未満のLST添字値LSTアレイになります。

メンテナンスと会長の木だけで罰金。

思考のこのラインを覚えておいてください。

1の#include <cstdioを>
 2の#include <iostreamの>
 3  使用して 名前空間STDを、
4  int型の C [ 400005 ] [ 2 ]、[F 400005 ]、[W 400005 ]、N、M、K、選ぶ、[FID 400005 ]、LST [ 200005 ]、Q [ 400005 ]。
5  INT X [ 200005 ]、Y [ 200005 ]、ANS、RT [ 200005 ]、V [ 5000005 ]、T [ 5000005 ] [ 2 ]、LZ [ 400005 ]、CNT。
6  INTの検索(int型 P){戻り FID [P]を== P P:FID [P] = 見つける(FID [P]);}
 7  の#define液晶C [P] [0]
 8  の#defineのRC C [P] [1]
 9  ブール not_root (int型 P){ 戻り C [F [P]] [ 0 ] == P || C [F [P] [ 1 ] == P;}
 10  空隙 REV(int型 P){LC ^ = RC ^ = LC ^ = RC; LZ [P] ^ = 1 ;}
 11  ボイドダウン(int型 P){ 場合(LZ [P])REV(LC)、REV(RC)、LZ [P] = 0 ;}
 12  空隙アップ(INT P){W [P] =分(P> N P:1234567890、分(W [LC]、W [RC]));}
 13  ボイド回転(INT P){
 14      INT FA = F [P]、GR = [FA] F、DIR = C [FA] [ 1 ] = = P、BR = C [P] [!DIR];
15      であれば(not_root(FA))C [GR] [GR] [C 1 = P] == FA]。C [P] = FA [DIR!]。C [FA] [DIR] = BR。
16      F [P] = GR。F [FA] = P。F [BR] = FA。(FA)まで。
17  }
 18  空隙スプレイ(int型P){
 19      INT RES = P、トップ= 0 ; Q [++トップは] = Pと、
20      一方(not_root(RES))Q [++トップ] =のRES = F [RES]。
21      しばらく(トップ)ダウン(Q [top-- ])。
22      一方(not_root(P)){
 23          INT FA = F [P]、GR = F [FA]。
24          場合(not_root(FA))が回転(C [FA] [ 1 ] == P ^ C [GR] [ 1 ] == FA?FA:P)。
25          回転(P)。
26      }
 27      アップ(P)。
28  }
 29回の ボイド(アクセスINT P){ ためint型、Y = 0 ; P; P = F [Y = P])スプレイ(P)、RC = Y、アップ(P);}
 30  空隙 make_root(int型p)を{アクセス(P)、スプレイ(P); REV(P);}
 31 ボイドスプリット(int型のx、int型のY){make_root(x)は、アクセス(Y)、スプレイ(Y);}
 32  ボイドカット(int型のx、int型の Y){スプリット(X、Y); F [X] = C [Y] [ 0 ] = 0 ;アップ(Y);}
 33  空隙リンク(int型のx、int型の Y){make_root(x)は、[X] = F まで(Y); Y}
 34  空隙ビルド(INT&P 、INTの CPY、int型の ADX、int型の L = 0INT R = M){
 35      であれば(P)P = ++!CNT。
36      もし(L == R){V [P] = V [CPY] + 1返す;}
 37      場合(ADX <= L + R >> 1)を構築(T [P] [ 0 ]、Tは[CPY] [ 0 ]、ADX、L、L + R >> 1)、T [P] [ 1 ] = T [CPY] [ 1 ]。
38      (T [P] [ビルド1 ]、tは[CPY] [ 1 ]、ADX、(L + R >> 1)+ 1 [R)、T [P] 0 ] = T [CPY] [ 0を];
39      V [P] = V [T [P] [ 0 ] + V [T [P] [ 1 ]。// のprintf( "%D%D%D \ n"は、L、R、V [P])。
40  }
 41  INT尋ねる(INT P1、INT P2、int型の L、INT R、INT CL = 0INT CR = M){ // のprintf( "%D%D%D%D \ n"は、CR、CL、V [P2] 、V [P1])。
42      もし((V [P2] -v [P1])!)の戻り 0 ;
43      であれば(L <= CL && CR <= r)は戻り V [P2] - V [P1]。
44      リターン(L <= CL + CR >> 1(Tの[P1に]尋ねる[?0 ]、T [P2] [ 0 ]、L、R、CL、CL + CR >> 1):0)+(R > CL + CR >> 1?頼む(のt [p1の] [ 1 ]、T [P2] [1 ]、L、R、(+ CL CR >> 1)+ 1、CR):0 );
45  }
 46  INTメイン(){W [ 0 ] = 1234567890 47      のscanf(" %D%D%D%D "、&​​N、&M、&K、&OPT)。
48      のためにint型 I = 1を I ++; iが<= N)[I] = FID iは、
49      のためにint型 I = 1 ; I <= M; ++ i)が{
 50          のscanf(" %D%dの"、およびX [i]は、&Y [I])。
51          もし(X [I] == Y [i])とLST [I] = I。
52          他の 場合 FID [FID [X [I]]] = FID [Y [I]、リンク(X [i]は、N + I((x [i]が)!=を見つける(Y [i])と見つけます。) )、リンク(N + I、Y [I])。
53          他の分割(X [i]は、Y [i])と、LST [I] = W [Y [I]] - N、カット(LST [I] + N [LST [i]は、X)、カット( [I] + LST N、Y [LST [I])、
 54              リンク(X [i]は、N + I)、リンク(Y [i]は、N + I)。
55          ビルド(RT [i]は、RT [I- 1 ]、LST [I])。// のprintf( "%d個の\ n"、LST [I])。
56      }
 57      のためにINT I = 1、L、R、iは= K <; ++ I){
 58          のscanf(" %d個の%のD "、&​​L&R)。
59          もし(OPT)S ^ =年= R ^ 年。
60          歳= N-尋ねる(RT 1- [ 1 ] RT [R] 0、L 1 )。
61          のprintf(" %d個の\ n " 、年)。
62      }
 63 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/hzoi-DeepinC/p/11566956.html