原題鏈結
給一棵樹,每個節點都有乙個權值,每次操作從根節點開始到葉子節點,問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的時候可以將兩種都不是當前正在處理的...