bzoj 3252 攻略 長鏈剖分思想 貪心

2022-05-18 06:12:16 字數 1619 閱讀 2655

time limit: 10 sec  memory limit: 128 mb

submit: 889  solved: 423

[submit][status][discuss]

題目簡述:樹版[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

10其實有種比較好的演算法,就是長鏈剖分放入佇列,排個序就可以了。

然而配對堆實現了一下,比較麻煩,刪除的東西比較多,但是複雜度是一的。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

9#define ll long long

10#define pa pair11

#define n 200007

12using

namespace

std;

13 inline int

read()

1417

while(isdigit(ch))

18return x*f;19}

2021

intn,k;

22int

val[n],last[n];

23ll mx[n],ans;

24int

cnt,hed[n],rea[n],nxt[n];

25 __gnu_pbds::priority_queue::point_iterator id[n];

26 __gnu_pbds::priority_queueq;

2728

void add(int u,int

v)29

34void dp(int

x)35

42 mx[x]+=val[x];

43 id[x]=q.push(make_pair(mx[x],x));44}

45void del(int

x)4656}

57}58int

main()

5969 dp(1

);70

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

7176 printf("

%lld\n

",ans);

77 }

BZOJ 3252 攻略(長鏈剖分)

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

bzoj3252 攻略(長鏈剖分 貪心)

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

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

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