HDU 5242 Game 樹鏈剖分

2021-10-12 16:14:49 字數 1498 閱讀 4999

原題鏈結

給一棵樹,每個節點都有乙個權值,每次操作從根節點開始到葉子節點,問k次操作,最多可以取多少。

因為答案是對樹鏈求和統計,所以可以考慮樹剖,也是考慮去剖重鏈(根據權值),最後只要沿著重兒子一路統計出所有的鏈的值,在從大到小排個序取k個就可以了。想到樹剖之後就是相當板子的題了。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fi first

#define se second

#define pb push_back

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n =

5e5+

10, m =

5e5+

10, inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

int n, m, cnt, k, h[n]

;ll dp[n]

, f[n]

, son[n]

, a[n]

;struct edge e[m]

;void

add(

int u,

int v)

void

dfs1

(int u,

int fa)

if(son[u]

) f[u]

+= f[son[u]];

}void

dfs2

(int u,

int fa,

int t)

for(

int i = h[u]

;~i; i = e[i]

.next)

}void

solve()

dfs1(1

,0);

dfs2(1

,0,1

);sort

(dp+

1, dp+n+1)

;reverse

(dp+

1, dp+n+1)

; ll ans =0;

for(

int i =

1; i <= k; i++

) ans +

= dp[i]

;printf

("case #%d: %lld\n"

,++c, ans);}

}int

main()

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

HDU3966 樹鏈剖分

題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...

hdu5029 樹鏈剖分

這題絕對好題。題意很簡單,也很容易想到樹鏈剖分,之後就不太好做了。開始想的是按顏色排序,然後每次處理一種顏色,求出最優解。這樣做的話,最壞情況會退化到n 2,不可接受。之後用線段樹維護,乙個節點只存在一種顏色,而且排序之後能保證在樹中顏色不會交叉,pushdown的時候可以將兩種都不是當前正在處理的...