問題の解決策
- ビットiについてツリーで、このチェーンのルートにポイントの色が初めてである場合、このツリーJ(ルートLCAにiとj)の他の点について、缶私はポイントの組成、色、J(Iなど)iは寄与の大きさに応答するであろう[I]サブツリー
- その後、パーティションを解消することができます
コード
1の#include <cstdioを> 2の#include <iostreamの> 3 の#define LL長い長い 4 使って 名前空間STD。 5 のconst int型 N = 2E5 + 10、INF = 1E8。 6 INTの N、CNT = 1、ルート、ヘッド[N]、V [N]、VIS [N * 2 ]。 7 LL qを、和、NUM、TOT、のMx = INF、サイズ[N]、COL [N]、ANS [N]、P [N]。 8 構造体の縁{ int型への ; } E [N * 2 ]。 9 空をクリア(int型のx、int型FA){P [V [X] = COL [V [X]] = 0 ; 以下のための(int型 ; I。I = E [i]はI =ヘッド[X] から)の場合(!!VIS [I] && E [i]を.TO = FA)(X、.TO [i]はE)をクリアします。} 10 ボイド挿入(int型のx、int型のY) 11 { 12 E [++ CNT] .TO = Y、E [CNT]。ヘッド[X]、ヘッド[X] = = CNT。 13 = Xの.TO E [++ CNT]、E [CNT]。ヘッド[Y]、ヘッド[Y] = = CNT。 14 } 15 空隙 DFS1(int型のx、int型FA) 16 { 17 サイズ[X] = 1、P [V [X]] ++ ; 18 のために(int型 ; I。I = E [i]は、I =ヘッド[X] から)場合(!E [i]は.TO = FA && VIS [i])とDFS1(E [I] .TO、X) 、サイズ[X] + = サイズ[E [i]の.TO]。 19 もし(P [V [X]] == 1)合計+ =サイズ[X]、COL [Vの[X] + = サイズ[X]。 20 P [X [V]] - 。 21 } 22 空隙 DFS2(int型のx、int型FA) 23 { 24 P [V [X]] ++ ; 25 もし(P [V [X]] == 1)sum- = COL [V [X]]、NUM ++ 。 26の ANS [X] + =合計+ NUM *のQ。 27 のためには、(int型 ; I I = E [i]は、I =ヘッド[X]。から)場合(VIS [I] && E [I] .TO =!FA)DFS2(E [I] .TO、X) ; 28 もし(P [V [X]] == 1)合計+ = COL [V [X]]、num-- 。 29 P [Vの[X]] - 。 30 } 31 ボイド FindRootで(int型のx、int型FA) 32 { 33 サイズ[X] = 1。LL MX = 0 。 34 のためには、(int型 I; I = E [i]は、I =ヘッド[X]を。から)の場合(E [i]の.TO!= FA &&!VIS [i])とにfindroot(E [i]の.TO、x)は、サイズ[X] + =サイズ[E [i]の.TO]、MX = MAX( MX、サイズ[E [i]の.TO])。 35 MX = MAX(MX、tot- サイズ[X])。 36 であれば(MX <MX)はMx = MX、ルート= X。 37 } 38 空隙変化(int型のx、int型 FA、int型K) 39 { 40 P [V [X]] ++ ; 41 のために(int型 ; I。I = E [i]は、I =ヘッド[X] から)場合(!E [i]は.TO = FA && VIS [i])と変化(E [I] .TO、X、 K)。 42 もし(P [V [X]] == 1)合計+ =(LL)サイズ[X] * K、COL [V [X] + =(LL)サイズ[X] * K。 43 P [Vの[X]] - 。 44 } 45 ボイド(解決int型のx、int型FA) 46 { 47 DFS1(X、FA)、ANS [X] + =和-COL [V [X]] + [X]のサイズと、 48 については、(int型 ; I I = E [i]はI =ヘッド[X]。から)の場合(VIS [I] && E [i]を.TO =!!FA) 49 のp [V [X]] ++、 sum- =サイズ[E [i]の.TO]、COL [V [X]] - =サイズ[E [i]の.TO]、変更(E [I] .TO、X - 1)、P [V [X] - 、Q =サイズ[X] -size [E [i]の.TO]、DFS2(E [I] .TO、x)は、P [V [X]] ++、合計+ =サイズ[ E [i]は.TO]、COL [V [X] + =サイズ[E [i]の.TO]、変更(E [I] .TO、X、1)、P [Vの[X]] - 。 50 和= 0、NUM = 0 、クリア(X、FA)。 51 のために(int型 ; I。I = E [i]は、I =ヘッド[X] から)場合(!VIS [I] && E [i]は.TO = FA)VIS [I] = 1、VIS [I ^ 1 ] = 1、TOT =サイズ[E [i]の.TO]のMx = INF、FindRootで(E [I] .TO、X)、(ルートを解決0 )。 52 } 53 のint main()の 54 { 55 のscanf(" %d個"、&N) 56 のために(INT I = 1; iが<= N; iが++)scanf関数を(" %のD "、&V [I])。 57 のために(int型 I = 1、X、Y、iがn <; iは++)のscanf(" %d個の%のD "、およびX&Y)、(X、Y)を挿入します。 58 TOT = N、FindRootで(1、0)、(ルート、解決0 )。 59 のためには、(int型 i = 1 ; iが<= N; iが++)のprintf(" %のLLDを\ n " 、ANS [I])を、 60 }