人種

これは、問題の大き1000000のk個の注文を、私は万人のローカル配列を開くことはしませんでした。

なぜグローバル間違って行く可能性が高いですか?再帰的な時間なので、このデータは次の層の使用のものであってもよいです。

それらを避けるためにどのように別々の処理と再帰にあります。逃げます!

コードを見てください:

#include <ビット/ STDC ++ H> 
名前空間使用STDと、
const int型MAXN = 1000000 + 100 
#define INF 1E9 
整数N、K。
INTのBEG [MAXN]、NEX [MAXN]乃至[MAXN]、W [MAXN]、E。 ボイド追加(int型のx、int型のy、int型Z){  E ++; NEX [E] = BEG [X]。BEG [X] = E [E] = Yであり; W [E] = Z; } int型のMX、RT、サイズ。int型SZ [MAXN]、息子[MAXN]、VIS [MAXN]。インラインボイドgetrt(int型のx、int型FA){SZ [X] = 1、息子[X] = 0 ; (INT I = BEG [X]; I;私は=用NEX [I]){int型T = [I]にします。もし(T == FA || VIS [T])続けますgetrt(T、X)。SZ [X] + = SZ [T]。IF(息子[X] <SZ [T])息子[X] = SZ [T]。} IF(息子[X] <サイズSZ [X])息子[X] =、サイズSZ [X]。IF(息子[X] <MX)MX =息子[X]、RT =バツ; } int型ボット[MAXN]、トップ、Q1 [MAXN]、Q2 [MAXN]、ANS。インラインボイドSTK(int型のx、int型FA、INTヴァル、INT エッジ){IF(ヴァル> k)のリターン; IF(ヴァル== K){ANS = 分(ANS、エッジ)。リターン; } IF(エッジ> = ANS)のリターン; Q1 [++トップ] = ヴァル。Q2 [トップ] = 縁。(INT I = BEG [X]; I;私は=用NEX [I]){int型T = [I]にします。もし(T == FA || VIS [T])続けますSTK(T、X、ヴァル+ W [i]は、エッジ+ 1 )。}} int型TMP [MAXN]、qwq。インラインボイド分割(int型X){VIS [X] = 1; qwq = 0 (INT I = BEG [X]; I;私は=用NEX [I]){int型T = [I]にします。IF(VIS [T])続けますトップ= 0 ; STK(T、X、W [i]は、1 )。用(INT J = 1; J <=頂; J ++ )ANS =分(ANS、Q2 [J] +ボット[K- Q1 [J])。(int型J = 1; J <=トップ; J ++)ボット[Q1 [J] = 分(ボット[Q1 [J]、Q2 [J])。(; J <=トップJ ++ INT J = 1 TMP [++ qwq] =)Q1 [J]。}(I ++; I <= qwq INTがI = 1のためのボット[TMP [I] =)INF。(INT I = BEG [X]; I;私は=用NEX [I]){int型T = [I]にします。IF(VIS [T])続けますMX = INF、RT = 0、サイズ= SZ [T]。getrt(T、X)。分割(RT)。}} int型のmain(){CIN >> N >> K。INT X、Y、Z。以下のために(INT I 1 =; N I <; I ++ ){scanf関数は( "%D%D%D"、およびX&Y、およびZ)。X ++、Y ++ (x、y、z)を追加し、(X、Y、Z)を加えます。}(I ++; I <= K INTがI = 1のためのボット[I] =)1E9。ANS = infファイル。MX = INF、RT = 0、サイズ= N。getrt(1,0 )。分割(RT)。IF(ANS> = N)プット( " - 1" )。他のprintf( "%d個\ n"は、ANS)。0を返します}

残念ながら、私はハッハッハ、再びACでした!

おすすめ

転載: www.cnblogs.com/syzf2222/p/12386777.html