bzoj 3252 攻略 長鏈剖分 貪心

2022-08-20 22:57:10 字數 1659 閱讀 1790

time limit: 10 sec  memory limit: 128 mb

題目簡述:樹版[k取方格數]

眾所周知,桂木桂馬是攻略之神,開啟攻略之神模式後,他可以同時攻略k部遊戲。

今天他得到了一款新遊戲《xx半島》,這款遊戲有n個場景(scene),某些場景可以通過不同的選擇支到達其他場景。所有場景和選擇支構成樹狀結構:開始遊戲時在根節點(共通線),葉子節點為結局。每個場景有乙個價值,現在桂馬開啟攻略之神模式,同時攻略k次該遊戲,問他觀賞到的場景的價值和最大是多少(同一場景**多次是不能重複得到價值的)

「為什麼你還沒玩就知道每個場景的價值呢?」

「我已經看到結局了。」

第一行兩個正整數n,k

第二行n個正整數,表示每個場景的價值

以下n-1行,每行2個整數a,b,表示a場景有個選擇支通向b場景(即a是b的父親)

保證場景1為根節點

輸出乙個整數表示答案

5 24 3 2 1 1

1 21 5

2 32 4

10對於100%的資料,n<=200000,1<=場景價值<=2^31-1

首先想到的是樹鏈剖分,似乎複雜度不是很優qaq

然後bzoj的標籤是 dfs序+線段樹 似乎還是不會。。(似乎我太弱辣

orz了一下zgz的題解,隨便搞搞長鏈剖分,每次貪心取最長鏈,一定是最優解,然後長鏈剖分保證了鏈不相交,和最長鏈的最優性

發現好有道理qaq,然後就是長鏈剖分的裸題  orz 長公主 

這似乎是我真正意義上的第一道長鏈剖分 >_<

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 1000000007

#define ll long long

#define n 200010inline

intrd()

while(ch>='

0'&&ch<='9')

return x*f;

}int

fro[n],to[n],lj[n],cnt;

void add(int a,int b)

intn,m,fa[n],rt;

ll a[n],mx[n];

intson[n];

priority_queue

q;void dfs1(int x,int

f) mx[x]=a[x]+mx[son[x]];

}void dfs2(int x,int

tp) dfs2(son[x],tp);

for(int i=lj[x];i;i=fro[i])

}ll ans;

bool

ru[n];

intmain()

for(int i=1;i<=n;i++) if(!ru[i]) rt=i;

dfs1(rt,

0);dfs2(rt,rt);

for(int i=1;i<=m&&!q.empty();i++)

printf(

"%lld\n

",ans);

return0;

}

BZOJ 3252 攻略(長鏈剖分)

題目簡述 樹版 k取方格數 眾所周知,桂木桂馬是攻略之神,開啟攻略之神模式後,他可以同時攻略k部遊戲。今天他得到了一款新遊戲 xx半島 這款遊戲有n個場景 scene 某些場景可以通過不同的選擇支到達其他場景。所有場景和選擇支構成樹狀結構 開始遊戲時在根節點 共通線 葉子節點為結局。每個場景有乙個價...

bzoj3252 攻略(長鏈剖分 貪心)

傳送門 長鏈剖分好題。題意 給一棵帶點權的樹,可以從根節點到任一葉節點走k kk次,走過的點只能計算一次,問k kk次走過的點點權值和最大值。思路 考慮將整棵樹帶權長鏈剖分,這樣鏈與鏈之間是不會重複選擇的。然後每條鏈都對應一種方案,我們貪心選擇前k kk大即可。include define ri r...

BZOJ3252 攻略(長鏈剖分,貪心)

bzoj 給定一棵樹,每個點有點權,選定 k 個葉子,滿足根到 k 個葉子的所有路徑所覆蓋的點權和最大。乙個假裝是對的貪心 每次選擇最大的路徑,然後將路徑上所有點的權值清零。那麼我們可以用長鏈剖分來實現這個貪心。鏈長改為最大的路徑權值和,這樣子把每條重鏈的權值丟進乙個堆裡面取 k 次即可。正確性自己...