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中,誰不能取了誰就輸。思路階梯博弈 階梯博弈等效為奇數號階梯的尼姆博弈。假設我們是先手。我們按照尼姆博弈的原則進行第一次移動。如果對方移動奇數號階梯的石子,我們繼續按照尼姆博弈的原則移動。...