題目簡述:樹版[k取方格數]
眾所周知,桂木桂馬是攻略之神,開啟攻略之神模式後,他可以同時攻略k部遊戲。今天他得到了一款新遊戲《xx半島》,這款遊戲有n個場景(scene),某些場景可以通過不同的選擇支到達其他場景。所有場景和選擇支構成樹狀結構:開始遊戲時在根節點(共通線),葉子節點為結局。每個場景有乙個價值,現在桂馬開啟攻略之神模式,同時攻略k次該遊戲,問他觀賞到的場景的價值和最大是多少(同一場景**多次是不能重複得到價值的)
「為什麼你還沒玩就知道每個場景的價值呢?」
「我已經看到結局了。」
第一行兩個正整數n,k
第二行n個正整數,表示每個場景的價值
以下n-1行,每行2個整數a,b,表示a場景有個選擇支通向b場景(即a是b的父親)
保證場景1為根節點
n<=200000,1<=場景價值<=2^31-1
輸出乙個整數表示答案
5 24 3 2 1 1
1 21 5
2 32 4
乙個類似長鏈剖分的東西。
直接把鏈按照權值剖分,取前k個最長的鏈
#include#define lll long long
using namespace std;
lll read()
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}const lll n=200010;
lll n,k,cnt,opt,ans,x,y;
lll a[n],head[n],son[n],sum[n],c[n];
struct nodeedge[n];
bool cmp(lll p,lll q)
void add(lll x,lll y)
void dfs1(lll k)sum[k]+=a[k];
}void dfs2(lll k,lll top)
}int main()dfs1(1);dfs2(1,1);sort(c+1,c+1+opt,cmp);
for(lll i=1;i<=k;i++)ans+=c[i];
printf("%lld\n",ans);return 0;
}
bzoj3252 攻略(長鏈剖分 貪心)
傳送門 長鏈剖分好題。題意 給一棵帶點權的樹,可以從根節點到任一葉節點走k kk次,走過的點只能計算一次,問k kk次走過的點點權值和最大值。思路 考慮將整棵樹帶權長鏈剖分,這樣鏈與鏈之間是不會重複選擇的。然後每條鏈都對應一種方案,我們貪心選擇前k kk大即可。include define ri r...
BZOJ3252 攻略(長鏈剖分,貪心)
bzoj 給定一棵樹,每個點有點權,選定 k 個葉子,滿足根到 k 個葉子的所有路徑所覆蓋的點權和最大。乙個假裝是對的貪心 每次選擇最大的路徑,然後將路徑上所有點的權值清零。那麼我們可以用長鏈剖分來實現這個貪心。鏈長改為最大的路徑權值和,這樣子把每條重鏈的權值丟進乙個堆裡面取 k 次即可。正確性自己...
bzoj 3252 攻略 長鏈剖分 貪心
time limit 10 sec memory limit 128 mb 題目簡述 樹版 k取方格數 眾所周知,桂木桂馬是攻略之神,開啟攻略之神模式後,他可以同時攻略k部遊戲。今天他得到了一款新遊戲 xx半島 這款遊戲有n個場景 scene 某些場景可以通過不同的選擇支到達其他場景。所有場景和選擇...