トピック:https://vjudge.net/contest/323699#problem/A
質問の意味:あなたのツリーを与えるために、そして、m個のクエリがあり、各クエリは、一つのパスを尋ねた特定のクエリのエッジの最大数よりも少ないです
アイデア:最初に、我々は、我々が実際にクエリ未満の各辺の重みのすべての接続されたブロックを計算することができることを見て、それから和+ Cは、(N、2) 、各通信ブロックの両方に対してプラスの値は、ここで答えは、しかし各クエリを通じて多く、我々確かにすることはできませんO(n)とのクエリ数が、アイデアは確かにそれに対処する方法を、計算された組み合わせの数のブロックUnicom社の数であることに注意してください、我々は彼が私のサイズと値の右側にあることに注意してください我々は通信ブロックにそれを使用できるかどうか、答えはイエスです、我々は、クエリを並べ替えることができます前に、最初に小さな値を見つけ、模索するために関連する値は、クエリをバックアップするための時間が以前の通信ブロックを拡張し続け、すべての合計クエリ私たちは再びツリーをトラバース複雑さが、我々が対処する悪いDFS、どのように我々はここでそれを得るか、通信ブロックアルゴリズムは、いくつかの、DFS、ばらばらのセット、tarjanを持っていた、我々はDFSとtarjanを除外することができ、その後、我々は確かにばらばらのセットを使用します、我々はまた、ソート右側の、そして私たちは、ユニコムブロックの合併の各側面を使用することができ、それの寄与を計算する方法を、私たちは送信されます ブロックBとブロックAと通信をブロックとの間の通信の通信経路は、オペレータのパスを介して通信ブロックB、完成したと考えられてきた、そして今ポイントに通信ブロック、点B1の通信ブロック、プラス寄与を要求していますa.size * b.size
<ビット/ STDC ++ H>の#include の#define MAXN 200005 の#define MOD十億七 使用 名前空間STDを、 typedefの長い 長いLL。 構造体SSS { LLのX、Y、Z。 } [MAXN]。 構造体EEE { LL IDと、値; } CX [MAXN]。 LLのN、M、Q。 長い 長い DA [MAXN]。 【MAXN】SIZ LL。 LL F [MAXN]。 INT CMP(構造体 SSS X、構造体のSSS Y){ 戻り XZ < YZ。 } int型 CMP1(構造体 EEEのX、構造体EEEのY){ 戻り x.value < y.value。 } int型の検索(INT X){ 場合(X == F [X])戻りX。 他の リターン [X] = F ([X] F)を見つけます } int型のmain(){ scanf関数(" %のLLDの%のLLD "、&N、&M)。 以下のために(int型 i = 0 ; iはN- < 1 ; I ++ ){ scanf関数を(" %LLD%LLD%LLD "、および[I] .X、&[I] .Y、および[I] .Z)を。 } ソート(A + N- 1、CMP)。 以下のために(int型 i = 0 ; iがm <; iは++ ){ CXを[I] .ID = I。 scanf関数(" %のLLD "、およびCX [i]の.VALUE)。 } ソート(CX、CX + M、CMP1)。 以下のために(int型 i = 1 ; iは= N <; iは++ ){ F [I] = I。 SIZ [I] = 1 。 } / * (I = 0 int型、iがN-1 <; I ++の)のための{ のprintf( "%D%D%D \ n"は、[I] .X、[I]・Y [I] .Z); } * / LL DEX = 0; LL合計 = 0 ; 以下のために(int型 i = 0 ; iは<N- 1 ; I ++ ){ 場合([i]が.Z <= CX [DEX] .VALUE){ int型 XX =を見つける([I] .X)。 INT YY = ([I]・Y)を求めます。 もし(!= XX YY){ 合計 + = SIZ [XX] * SIZ [YY]。 F [YY] = XX。 SIZ [XX] + = SIZ [YY]。 } } 他{ DA [CX [DEX] .ID] =和; DEX ++ ; もし(DEX ==メートル)ブレーク。 I - ; } } のための(; <M DEX; DEX ++ ){ DA [CX [DEX] .ID] = 合計。 } のために(int型 i = 0 ; iがmを<; iは++ ){ のprintf(" %のLLDを" 、DA [I])。 } }