Game HDU 5242 樹鏈思想

2022-03-16 16:57:39 字數 1317 閱讀 5341

gamehdu - 5242

題目大意:乙個遊戲有n個場景形成了棵有根樹,根節點是1,每個場景都有它的權值。然後乙個人可以選擇其中k個分支來走,而每個場景的權重只算一遍,問最大的權值和。

一開始想叉了,覺得是樹形dp加揹包,然後好麻煩就不懂寫了,但其實根本沒有那麼難。就是用到了個樹鏈的思想,把整棵樹分成一條條鏈,這樣就沒有了重複部分,然後就是從中取k條權值和最大的鏈。

具體操作類似於樹鏈剖分的分鏈處理(想起來樹鏈剖分拖了很久沒更,這兩天更上)。如果不知道重鏈和重兒子是什麼,可以先去學一下。在原來的定義裡,重兒子是兒子節點中子樹節點個數最多的節點,而我們這題就定義為兒子節點中擁有鏈權值和最大的那個節點。比如在樣例1中

2的重兒子就是3,而1的重兒子是2,這樣就有1到3一條重鏈,加上4到4,5到5,3條鏈。然後我們把不是鏈頂部的節點權值清空(在上圖中就是2和3),最後把所有節點權值,挑選k個最大的。

1 #include2 #include3

using

namespace

std;

4 typedef long

long

ll;5

const

int n=101108;6

struct

sides[n];

9ll val[n];

10int

sn,head[n],son[n];

11void init(int

n)1219}

20void add(int u,int

v)21

26void dfs1(int

u)27

35 val[u]+=val[son[u]];//

把它重兒子的權值算到它這裡 36}

37void dfs2(int u,int

tf)38

50}

51int

main()

5266 dfs1(1

);67 dfs2(1,1

);68 sort(val+1,val+1+n);

69 ll ans=0;70

for(int i=n;i>=1&&k;i--,k--)

7176 printf("

case #%d: %lld\n

",t++,ans);77}

78return0;

79 }

多理解多想想

5 24 樹種統計

隨著衛星成像技術的應用,自然資源研究機構可以識別每一棵樹的種類。請編寫程式幫助研究人員統計每種樹的數量,計算每種樹佔總數的百分比。輸入格式 輸入首先給出正整數n 10 5 隨後n行,每行給出衛星觀測到的一棵樹的種類名稱。種類名稱由不超過30個英文本母和空格組成 大小寫不區分 輸出格式 按字典序遞增輸...

5 24 總結部落格

打完雞血本應是激情滿滿的一周,卻往往不如其意。本週看了幾道質數的題 本來用dfs爆搜的題目才發現有專門的演算法名字,慚愧。tarjin演算法 tcl話說沒什麼手感的時候寫寫力扣不錯,題解不錯。對dp還是心有餘而力不足,其間奧妙仍望 忘切許多知識,賽中拾之,微通,未以博文記之。因惰,愧矣。案上電腦,對...

Game HDU 3389 (階梯博弈)

題目 題意1 n帶編號的盒子,當編號滿足a b a非空 a b 3 0 a b 2 1則可以從a中取任意卡片到b中,誰不能取了誰就輸。思路階梯博弈 階梯博弈等效為奇數號階梯的尼姆博弈。假設我們是先手。我們按照尼姆博弈的原則進行第一次移動。如果對方移動奇數號階梯的石子,我們繼續按照尼姆博弈的原則移動。...