[2019瀋陽Dネットワークゲームタイトル]ドーン-Kの水(点線ルール)

トピックリンク

タイトルは残り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 = - !1I = エッジ[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、01 )。
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(10 );
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 }

 

おすすめ

転載: www.cnblogs.com/sainsist/p/11520254.html