タイトルは残り3のいずれかの時点で木から得て取ることを意味します。
これが格差のポイントであり、征服という疑問のゲームの意味を聞いていますが、それはその後、T.ない場合には、Tを支払うことになると思う前に、より多くの間違った書き込み マイナーな変更は、チームメイトが直接ORZ上毛DPを書いた結果。
試合後のメンテナンスは、何かが暴力などのタイトルを維持することができる羅区ボードのように考えて、あまりにも脳死だと思ったが、実際には身動きが取れません。
ゲーム後アイデアは、モジュロ3並びに数及び距離に重心から現在の距離を維持することです。その後、統計が残存価額、その後、統計的な貢献を取ってから2点を列挙するとき。
重複貢献を排除するために、下流の時間に注意してください。
コード醜い私にQAQを許してください
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 typedefの長い 長いLL。 4 のconst int型 MAXN = 3E4 + 15 。 5 のconst int型 MOD = 1E9 + 7 。 6 構造体ノード{ 7 INT 次、W、S、E、。 8 }エッジ[MAXN * 2 ]。 9 int型ヘッド[MAXN]、lenの; 10 ボイド(追加INT S、INT E、INT W){ 11 エッジ[LEN] .E = E。 12 エッジ[LEN] .W = W。 13 エッジ[LEN] .next = 頭部[S]。 14 頭[S] = LEN ++ 。 15 } 16 int型N、根、和。 17 INT VIS [MAXN]、F [MAXN]、息子[MAXN]。 18の LLのANS [ 4 ]、O [ 4 ]、NUM [ 4 ]。 19 ボイド getroot(int型のx、int型FA){ 20 息子[X] = 1、F [X] = 0 ; 21 のための(int型I =ヘッド[X]。I = - !1。I = エッジ[I] .next){ 22 のint Y = エッジ[I] .E。 23 であれば(Y == FA || VIS [Y])続けます。 24 getroot(Y、X)。 25 息子[X] + = 息子[Y]。 26 F [X] = MAX(F [x]は、息子[Y])。 27 } 28 F [X] = MAX(F [x]は、和- 息子[X])。 29 であれば(F [X] <F [ルート])ルート=のX。 30 } 31 空隙 getd(int型のx、int型 DIS、INT FA){ 32 O [DIS%3 ] ++ ; 33 NUM [DIS%3 ] + = DIS。 34 のためには、(int型 - ;!I = I =ヘッド[X] 1 ; I = {エッジ[I] .next) 35 のint Y = エッジを[I] .E。 36 であれば(Y == FA || VIS [Y])続けます。 37 getd(Y、(DIS +エッジ[I] .W)%のMOD、X)。 38 } 39 } 40 空隙 CAL(int型のx、int型のVal、INT 追加){ 41 getd(X、ヴァル、0); 42 のために(int型 I = 0 ; iが< 3 ; I ++ ) 43 のための(INT J = 0 ; J < 3 ; J ++ ){ 44の ANS [(私はJ + 1)%3 ] =(ANS [(私はJ + 1)%3 ] + O [I] * NUM [J] * MOD + MOD%を追加)%MOD。 45の ANS [(私はJ + 1)%3 ] =(ANS [(私はJ + 1)%3 ] O [J] * NUM + [I] * MOD + MOD%を追加)%MOD。 46 } 47 のための(int型 I = 0 ; iが<3 ; i)は++ O [I] = NUM [I] = 0 ; 48 49 50 } 51 空隙解く(int型X){ 52 CAL(X、0、1 )。 53 VIS [X] = 1 。 54 のためには、(int型 - ;!I = I =ヘッド[X] 1 ; I = {エッジ[I] .next) 55 のint Y = エッジを[I] .E。 56 であれば(VIS [Y])続けます。 57 CAL(Y、エッジ[I] .W、 - 1 )。 58 合計=息子[Y]。 59 ルート= 0 。 60 getroot(Y、0 ); 61 (ルート)を解きます。 62 } 63 } 64 INT メイン(){ 65 ながら(scanf関数(" %のD "、&N)=!EOF){ 66 LEN = 0 。 67 のためには、(int型 i = 0 ; iが<= N + 10、iは++ ) 68 VIS [I] = 0、ヘッド[I] = - 1 。 69 以下のために(int型 i = 1 ; iがn <; iは++ ){ 70 、INT X、Y、Z。 71 のscanf(" %D%D%D "、およびX&Y、およびZ)。 72 X ++、Y ++ 。 73 追加(X、Y、Z)。 74 追加(X、Y、Z)。 75 } 76 のための(int型 i = 0 ; iは< 3 ; iは++ ) 77の ANSを[I] = 0 ; 78 ルート= 0、F [ 0] = INT_MAX - 1 。 79 和= N。 80 getroot(1、0 ); 81 (ルート)を解きます。 82 のためには、(int型 i = 0 ; iが<= 2 ; I ++ ){ 83 であれば(I == 2 ) 84 のprintf(" %LLDする\ n " 、ANS [I])。 85 他の 86 のprintf(" %のLLD " 、ANS [I])。 87 } 88 } 89 }