[CF600E] Lomsat gelral--木ヒューリスティックマージ

(luoguからフェイス質問)

問題の意味の翻訳

N個のノードを有するツリーは、各ノードは、色、各色の数、各ツリーおよびサブツリーの要求最大の色数です。

CI <= N <= 1E5

 

  組み合わせた裸の木の発見的問題。統計は最初の出現回数の最大値を取得するために、再び掃引すると、その後の発生とmxCnt同じ色の数を確認するために、再度それを掃引。ブール配列を無理に勧めするためにも重く、空の貢献息子ライトを宣告偽のノートブール配列で標識されています。

コード:

  1. 書式#include <iostreamの>  
  2. 書式#include <cstdioを>  
  3. 書式#include <CCTYPE>  
  4. #define MAXN 100010  
  5. 使用して  名前空間stdを、  
  6. テンプレート< 型名T>  
  7. ボイドリード(T&X){  
  8.     X = 0。  
  9.     チャーCH = GETCHAR()。  
  10.     しばらく(!isdigit(CH))  
  11.         CH = GETCHAR()。  
  12.     しばらく(isdigit(CH))  
  13.         X = X * 10 +(CH ^ 48)、CH = GETCHAR()。  
  14. }  
  15. int型のn;  
  16. int型のヘッド[MAXN]、トップ;    
  17. 構造体E {    
  18.     、NXTにint型。    
  19. }エッジ[MAXN << 1]。    
  20. インライン  ボイドインサート(INT U、  INT V){    
  21.     エッジ[++トップ] =(E){V、ヘッド[U]}。    
  22.     ヘッド[U] =頂。    
  23. }    
  24. 息子をINT [MAXN]、サイズ[MAXN]。  
  25. 長い  長いANS [MAXN]。  
  26. ボイドDFS1(INT U、  INT PRE){  
  27.     サイズ[U] = 1。  
  28.     (用{; iはi =エッジ[I] .nxt [U] I =ヘッドINT)  
  29.         int型V =エッジ[I] .TO。  
  30.         (V ==前)であれば  続けます。  
  31.         DFS1(V、U);  
  32.         サイズ[U] + =サイズ[V]。  
  33.         もし(サイズ[V]>サイズ[息子[U]])  
  34.             息子[U] = V;  
  35.     }  
  36.     返します。  
  37. }  
  38. INT色[MAXN]、CNT [MAXN]、合計。  
  39. int型curSon、mxCnt。  
  40. BOOL VIS [MAXN]。  
  41. ボイドCALC(INT U、  INTプリ、  ブールOP){  
  42.     オペアンプ?(++ CNT [色[U]、mxCnt = MAX(mxCnt、CNT [色[U])):(--cnt [色[U]、VIS [色[U] =  偽)。  
  43.     (用{; iはi =エッジ[I] .nxt [U] I =ヘッドINT)  
  44.         int型V =エッジ[I] .TO。  
  45.         (|| == == curson中)であれば  
  46.             持続する;  
  47.         CALC(V、U、で)。  
  48.     }  
  49. }  
  50. ボイド統計(INT U、  INT PRE){  
  51.     もし(CNT [色[U]] == mxCnt &&!VIS [カラー[U]])  
  52.         和+ =色[U]、VIS [色[U] =  真。  
  53.     (用{; iはi =エッジ[I] .nxt [U] I =ヘッドINT)  
  54.         int型V =エッジ[I] .TO。  
  55.         もし(V!=前)  
  56.             統計情報(V、U);  
  57.     }  
  58.     返します。  
  59. }  
  60. DSUを(無効INT U、  INTプリ、  BOOL OP){  
  61.     (用{; iはi =エッジ[I] .nxt [U] I =ヘッドINT)  
  62.         int型V =エッジ[I] .TO。  
  63.         もし(V ==事前|| V ==息子[U])      
  64.             持続する;  
  65.         DSU(V、U、0);  
  66.     }  
  67.     もし(息子[U])  
  68.         DSU(息子[U]、U、1)= curson息子[IN]。  
  69.     mxCnt = 0;  
  70.     CALC(INについて、1);  
  71.     統計情報(U、PRE)。  
  72.     ANS [U] =合計。  
  73.     curSon = 0;  
  74.     (もし!上){  
  75.         合計= 0;  
  76.         計算値(0、上、中)。  
  77.     }  
  78. }  
  79. {int型のmain()  
  80.     (n)を読み出します。  
  81.     (のための、iが<= N; I ++ iは1 = INT)  
  82.         (色[I])を読み出します。  
  83.     あなたと、V。  
  84.     以下のために(1 = I int型、iがn <; ++ I){  
  85.         (U)を読んで、(v)を読みます。  
  86.         挿入、(V、U)を挿入(U、V)。  
  87.     }  
  88.     DFS1(1、0);  
  89.     DSU(1、0、1)。  
  90.     (のための、iが<= N; I ++ iは1 = INT)  
  91.         printf("%I64d"、ANS [I])。  
  92.     0を返します。  
  93. }  

   この問題のCFの給料だけで爆発すると......

おすすめ

転載: www.cnblogs.com/TY02/p/11323015.html