BZOJ 3252 攻略(長鏈剖分)

2022-04-30 09:30:11 字數 1133 閱讀 2584

題目簡述:樹版[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 某些場景可以通過不同的選擇支到達其他場景。所有場景和選擇...