我們首先想乙個dp方程:f[u
]=mi
nf[u]=min\,val[u]\}
f[u]=m
in。這個方程可以通過矩陣的形式來表示。
先把樹輕重鏈剖分了。
我們設g[u
]g[u]
g[u]
為u
uu的所有輕兒子的f
ff總和,v
vv為u
uu的重兒子。
則f [u
]=mi
nf[u]=min\
f[u]=m
in。我們可以把這個寫成乙個最短路矩陣相乘的形式。
[ 0f
[u]]
=[0f
[v]]
×[0v
al[u
]∞g[
u]
]\left[ \begin0 & f[u] \end \right] = \left[ \begin 0 & f[v] \end \right] \times \left[ \begin 0 & val[u] \\ \infty & g[u] \end \right]
[0f[u
]]=
[0f
[v]
]×[0
∞va
l[u]
g[u]
]這個乘法是最短路矩陣相乘,就是取max。可以證明這是滿足結合律的,組合證明其實很好想。
所以我們樹剖維護矩陣乘法,修改時爬鏈修改就好了。注意要維護從右往左的,因為我們是從dfs
dfsdf
s序大的往小的轉移的。
#include
#define int long long
using
namespace std;
const
int n=
200005
,inf=
0x3f3f3f3f3f3f3f3f
;int n,q,cnt,u,v,val[n]
,head[n]
,to[n*2]
,nxt[n*2]
,f[n]
,g[n]
;int idx,fa[n]
,dep[n]
,siz[n]
,son[n]
,dfn[n]
,pos[n]
,top[n]
,bot[n]
;char op[5]
;struct matrix
matrix operator*(
const matrix &b)}}
}return c;
}}a[n]
,minn[n*4]
;void
adde
(int u,
int v)
void
dfs(
int u)}}
}void
dfs(
int u,
int tp)
f[u]
=g[u]
=inf;
if(son[u]
)int v;
for(
int i=head[u]
;i;i=nxt[i])}
f[u]
=min
(f[u]
+g[u]
,val[u]);
}void
build
(int o,
int l,
int r)
int mid=
(l+r)/2
;build
(o*2
,l,mid)
;build
(o*2+1
,mid+
1,r)
; minn[o]
=minn[o*2+
1]*minn[o*2]
;}void
upd(
int o,
int l,
int r,
int k)
int mid=
(l+r)/2
;if(k<=mid)
else
minn[o]
=minn[o*2+
1]*minn[o*2]
;}matrix qry
(int o,
int l,
int r,
int l,
int r)
int mid=
(l+r)/2
;if(r<=mid)
else
if(l>mid)
else
}int
query
(int u)
void
update
(int u)
u=top[u]
; g[fa[u]]-
=f[u]
; f[u]
=qry(1
,1,n,dfn[u]
,dfn[bot[top[u]]]
).a[0]
[1];
g[fa[u]]+
=f[u]
; u=fa[u];}
}signed
main()
for(
int i=
1;i)dfs(1
);dfs(1,
1);for
(int i=
1;i<=n;i++
)build(1
,1,n);
scanf
("%lld"
,&q)
;while
(q--
)else
}return0;
}
BZOJ4712 洪水 樹鏈剖分 線段樹
小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友 op,又叫管理員 開啟了創造模式,然後飛到山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了 我們把這個瀑布看成是乙個n個節點的樹,每個節點有權值 爬上去的代價 小a要選擇一些節點,以其權值和作為...
BZOJ4712 洪水 樹鏈剖分維護Dp
小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友 op,又叫管理員 開啟了創造模式,然後飛到 山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了 我們把這 個瀑布看成是乙個n個節點的樹,每個節點有權值 爬上去的代價 小a要選擇一些節點,以其權值和...
BZOJ4712 洪水 樹鏈剖分維護Dp
小a走到乙個山腳下,準備給自己造乙個小屋。這時候,小a的朋友 op,又叫管理員 開啟了創造模式,然後飛到 山頂放了格水。於是小a面前出現了乙個瀑布。作為平民的小a只好老實巴交地爬山堵水。那麼問題來了 我們把這 個瀑布看成是乙個n個節點的樹,每個節點有權值 爬上去的代價 小a要選擇一些節點,以其權值和...