Luogu5024 保衛王國

2022-05-17 14:43:12 字數 2311 閱讀 4763

\(f_\)表示以\(u\)為根的子樹中,\(u\)不取的最小開銷

\(f_\)表示以\(u\)為根的子樹中,\(u\)必取的最小開銷

\(g_\)表示以\(u\)為根的子樹中,不取重兒子,且\(u\)不取的最小開銷

\(g_\)表示以\(u\)為根的子樹中,不取重兒子,且\(u\)必取的最小開銷

設\(u\)的重兒子為\(w\)

\[f_=g_+f_\\

f_=g_+\min(f_,f_)

\]轉化方程

\[f_=\min(+\infty+f_,g_+f_)\\

f_=\min(g_+f_,g_+f_)

\]重定義矩陣乘法運算

\[c_=\min a_+b_

\]轉化為矩陣乘法

\[\begin

+\infty & g_\\

g_ & g_

\end

\times

\begin

f_ \\

f_\end

=\begin

f_ \\

f_\end

\]初始化葉子節點

\[\begin

0 \\

val_i

\end

\]轉化成\(2\times 2\)矩陣

\[\begin

0 & +\infty \\

val_i & +\infty

\end

\]基本結束

注意:節點\(a,b\)的\(g\)值也需要修改後再修改全域性平衡二叉樹

\(code:\)

#include#include#include#define n 100005

#define inf 10000000000007

#define ll long long

#define fa(x) f[x]

#define ls(x) ch[x][0]

#define rs(x) ch[x][1]

using namespace std;

int n,m,a,b,x,y,tot,rt,frt,val[n],fr[n],nxt[n << 1],d[n << 1];

int f[n],sz[n],son[n];

int q[n],qz[n];

int ch[n][2];

ll rc,rd,f[n][2],g[n][2];

char ty[5];

struct mat

mat operator * (mat b)

ll mn()

}z[n],s[n],ra,rb;

void add(int x,int y)

void dfs1(int u)

}}void update(int x)

int build(int l,int r)

else

l=mid+1;

}ls(q[o])=build(l,o-1);

rs(q[o])=build(o+1,r);

update(q[o]);

fa(ls(q[o]))=q[o];

fa(rs(q[o]))=q[o];

return q[o];

}void dfs2(int u)

else

f[u][0]=g[u][0]+f[son[u]][1];

f[u][1]=g[u][1]+min(f[son[u]][0],f[son[u]][1]);

z[u].setmat(inf,g[u][0],g[u][1],g[u][1]);

}if (son[f[u]]!=u)

}bool isrt(int x)

void modify(int x)

}int main()

else

modify(a);

rb=z[b];

if (y==0)

rd=g[b][1],g[b][1]=inf; else

rd=g[b][0],g[b][0]=inf;

if (son[b])

else

modify(b);

printf("%lld\n",(s[rt].mn()if (y==0)

g[b][1]=rd; else

g[b][0]=rd;

z[b]=rb;

modify(b);

if (x==0)

g[a][1]=rc; else

g[a][0]=rc;

z[a]=ra;

modify(a);

}return 0;

}

題解 LuoGu5024 保衛王國

原題傳送門 這裡不講ddp,用倍增優化樹形dp解決 前兩者可以直接遍歷求得,dpdp dp陣列可以倍增預處理的時候求得 對於每個詢問,要看兩個點u,v u,vu,v能影響到的區域 模仿倍增求lca lcalc a若u,vu,v u,v到根的鏈為同一條,則影響部分就是u uu到v vv若不是同一條,則...

LG5024 保衛王國

給定一棵 n 個點的樹,每個點的代價為 a i 每條邊至少有乙個端點要被選。m 次詢問,規定 x 和 y 選或不選,求覆蓋整棵樹的最小權值。考場上拿掉 44pts 就放棄了 下文中的 u 為子節點。這是不是非常顯然 dp x 0 1 表示第 x 個點不選 選時的最小代價 每次詢問時把 dp x 1 ...

P5024 保衛王國 倍增 dp

窩當然不會ddp啦,要寫這題當然是考慮優化裸dp啦,但是這題非常麻煩,於是變成了黑題。首先,這個是沒有上司的舞會模型,求圖的帶權最大獨立集。不考慮國王的限制條件,有 dp x 0 dp y 1 dp x 1 min dp y 1 dp y 0 現在考慮限制條件,如果對每乙個限制條件都做一次dp,複雜...