/ * アイデア:ツリー上の参照DSU、底部から合流アップ 各葉ノードには、合成各息子順番に各ノードの初期値を、割り当てられている 現在のノードのサブツリーIncorporatedの衝突を防止するためにすべてのノードは、再番号付けされている必要があり 、それらがノードに挿入するので、最終的にはサブツリーに入る現在のノードのように再度付け替え 再番号付けされるべき各アップをn回、Oの複雑さ(N ^ 2 ) * / の#include <ビット/ STDC ++ H> の#include <ベクトル> 使用して 名前空間STD; の#define N 2005 INT N-、P [N]、C [N]、ID [N]; ベクター < INT > G [N ]; ベクター < INT > サブツリー[N]; int型根、ボイド DFS(INT U、INT {PRE) IF(G [U] .size()== 1 &&事前== 0 ){ サブツリー[U] .push_back(U)。 ID [U] = 1。リターン; } のための(自動V:G [U]) であれば(!= V PRE)DFS(V、U)。 int型 TOT = 0 ; 用(オートV:G [U])場合(V =!PRE){ ための(自動X:サブツリー[V]){ サブツリー[U] .push_back(X)。 ID [X] + = TOT。 } TOT + = サブツリー[V] .size()。 サブツリー[V] .clear(); } スタック <int型 > STK。 一方、(stk.size())stk.pop(); 一方、(サブツリー[U] .size()> = C [U]){ stk.push(サブツリー[U] .back())。 サブツリー[U] .pop_back()。 } サブツリー[U] .push_back(U)。 ID [U] = C [U]。 一方、(stk.size()){ int型今= stk.top(); stk.pop()。 ID [今] ++ ; サブツリー[U] .push_back(今)。 } } int型のサイズ[N]。 ボイドのgetSize(INT U、INT PRE){ サイズ[U] = 1; 用(オートV:G [U]){ 場合(V ==予備)を続けます。 getSize(V、U);サイズ[U] + = サイズ[V]。 } } int型のmain(){ CIN >> N。 以下のために(INT iが= 1 ; I <= N; I ++ ){ CIN >> P [I] >> C [i]は、 C [i]の ++ ; G [i]が.push_back(P [I])。 G [P [I]一back(I)。 もし(P [I] == 0)ルート= I。 } のgetSize(根、0 ); にとって(INTは iは= 1 ; I <= N; I ++ ) 場合(サイズ[I] < C [I]){ プット(" NO ")。リターン 0 ; } DFS(ルート、0 ); プット(" YES " ); 以下のために(INT iが= 1 ; I <= N; I ++)COUT << ID [I] << " " 。 }
cf1286B--建設、ヒューリスティックマージ
おすすめ
転載: www.cnblogs.com/zsben991126/p/12159094.html
ランキング