bzoj4712 洪水 樹鏈剖分 動態dp

2021-08-25 08:53:12 字數 2905 閱讀 4194

我們首先想乙個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]

[0​f[u

]​]=

[0​f

[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要選擇一些節點,以其權值和...