[点線ルール] Luogu P2664ツリーゲーム

 

 

 

問題の解決策

  • ビット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] = 1LL 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で(10)、(ルート、解決0 )。
59      のためには、int型 i = 1 ; iが<= N; iが++)のprintf(" %のLLDを\ n " 、ANS [I])を、
60 }

 

おすすめ

転載: www.cnblogs.com/Comfortable/p/11329694.html