羅区P2634 [ナショナルチーム]コングコングココア点線のルール

そして、前回のテンプレートのタイトルに比べて、唯一のルートとするとき、パラメータのuを満たされた状態の数を決定するために、この関数は、この関数を完了した取引ができgetdisを変更している必要があります。2点間の距離が3で割り切れる場合はここでは問われます。そのため、3例だけで罰金の直接協議の数。

1、3つのカウントで割り切れるパス番号SUM0

2、SUM1によってカウント数よりもパス31に加え

3、数よりも通路32に加えて、SUM2によりカウント

最終的な答えは、SUM1 * SUM2 + SUM2 * SUM1 + SUM3 * SUM3 / N * Nその後、答えが何であるかを簡素化しています

#include <cstdioを> 
する#include <cstdlib> 
の#include <iostreamの> 
する#include <CStringの> 
する#include <cmath> 
の#include <アルゴリズム>
 の#define MAXN 20002
 の#define INF 2147483646
 の#defineは長い長いllの
 使用 名前空間STDを、
LL和[ 3 ]。
インラインint型 GI()// 输入挂
{
   int型の日付= 0、M = 1CHAR CH = 0 しばらく!(CH = ' - '&&(CH < ' 0 ' || CH> ' 9 '))CH = GETCHAR()。
  もし(CH == ' - '){M = - 1CH = GETCHAR();}
   一方(CH> = ' 0 ' && CH <= ' 9 ' 
    { 
      日付 =日付* 10 + CH- ' 0 ' 
      CH = GETCHAR()。
    } 戻り日付*のM。输出挂
{
   場合(QW < 0){のputchar(' - ')。QW = - QW;}
   もし(QW> 9)書き込み(QW / 10 )。
  putchar(QWの10 + ' 0 ' )。
} 

構造体ノード{ int型に、次、LEN;} T [ 2 * MAXN + 5 ]。
int型のヘッド[MAXN + 5 ]。
INT SIM [MAXN + 5 ]、mxson [MAXN + 5 ]。
BOOL VIS [MAXN + 5 ]。
int型MX、根、Summar; 
LL ANS; 
int型N-、K、CNT、S; 

ボイド addedge(INT U、int型 V、int型 L)//は図保存
{ 
  CNT ++ ; 
  T [CNT] .TO = V; 
  Tが[ CNT] .next = 頭部[U]、
  T [CNT] .LEN = L; 
  頭部[U] = CNT;
   返す; 
} 

ボイド getRoot(INT U、int型 FA)を// 重力関数の中心を見つける
{ 
  SIM [U] =を1 ; mxson [U] = 0;
   についてINT I =ヘッド[U]; Iは、I = T [I] .next)
    { 
      int型 V = T [I] .TO;
       IF(FA == || VIS V [V])続行; 
      getRoot( V、U)
      SIM [U] = SIM [U] + SIM [V]; 
      mxson [U] = MAX(SIM [V]、mxson [U]); 
    } 
  mxson [U] = MAX(mxson [U] 、-S- SIM [U]);
   IF(mxson [U] <MX)= U {ルート; MX = mxson [U];} 
} 

ボイド getdis(INT Uは、int型 FA、int型)DISTを// 計算し、複数の統計点から条件を満たすサブツリーの場合にUがDISにメモリアレイを移動します
{ 
  SUM [DIST3。 ] ++ ;
   のためのint型 I =ヘッド[U]; I; I = T [I] .next)
    { 
      int型 V = T [I] .TO;
       IF(VIS [V] || FA == V)続行; 
      getdis(V、U、(DIST + T [I] .LEN)%3。); 
    } 
  リターン; 
} 
LL GCD(LL、LL B){ 戻り Bの== 0 A:GCD? (Bは、%B);}
 int型 consolate(INT STA、INT LEN1)// 現在の状況の数が条件を満たして計算する
{ 
  SUM [ 0 ] = SUM [1 ] =和[ 2 ] = 0 
  getdis(STA、0 、LEN1)。
  っ今 = 2 *和[ 1 ] *和[ 2 ] +和[ 0 ] *(和[ 0 ] - 1)+和[ 0 ]。
  戻る今; 
} 

ボイド除算(INT TR)// 分治函数
{ 
  ANS = ANS + consolate(TR、0 ); 
  VIS [TR] = ;
  int型 ; I; I =のI =ヘッド[TR] T [i]は.next)
    {
      INTのV =のT [i]は.TO。
      もし(VIS [V])続けます
      ANSは =のANS - consolate(V、T [i]の.LEN)。
      S =シム[V]。ルート= 0 ; 
      MX = INF。getroot(V、0 ); 
      除算(ルート)。
    } 
  を返します
} 

int型のmain()
{ 
  int型Uを、V、L。
      N = GI()。
      CNT = 0 ; memsetの(頭、0はsizeof (ヘッド))。
      以下のためのint型 I = 1; iが<= N - 1私は++ 
    { 
      U = GIを()。V = GI()。L = GI()。
      addedge(U、V、L)。addedge(V、U、L)。
    } 
      ANS = 0 
      memsetの(VIS、0はsizeof (VIS))。
      MX = INF。S = N。getroot(10 ); 
      除算(ルート)。
      LL GYZ = GCD(N * N、ANS)。
      書き込み(ANS / GYZ)のputchar(' / ');(N / * N書き込みGYZ)。
  リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/wsblm/p/11202610.html