題解 LuoGu5024 保衛王國

2021-10-08 20:33:33 字數 2109 閱讀 7784

原題傳送門

這裡不講ddp,用倍增優化樹形dp解決

前兩者可以直接遍歷求得,dpdp

dp陣列可以倍增預處理的時候求得

對於每個詢問,要看兩個點u,v

u,vu,

v能影響到的區域

模仿倍增求lca

lcalc

a若u,

vu,v

u,v到根的鏈為同一條,則影響部分就是u

uu到v

vv若不是同一條,則把深度大的拎到同一深度一起往上跳,列舉lca

lcalc

a選不選,求得答案

code:

#include

#define maxn 100010

#define ll long long

#define mp make_pair

#define pii pair < int, int >

using

namespace std;

const ll inf =

1ll<<60;

struct edgeedge[maxn <<1]

;int num, head[maxn]

, n, q, d[maxn]

, fa[maxn][22

], val[maxn]

;char type[10]

;set < pii > st;

ll f[maxn][2

], g[maxn][2

], dp[maxn][22

][2]

[2];

inline

intread()

void

addedge

(int x,

int y)

, head[x]

= num;

}void

dfs(

int u,

int pre)}}

void

dfs2

(int u)

}ll solve

(int u,

int x,

int v,

int y)

, tv[2]

=, nu[2]

, nv[2]

; tu[x]

= f[u]

[x], tv[y]

= f[v]

[y];

for(

int i =

19; i >=0;

--i)

if(d[fa[u]

[i]]

>= d[v])if

(u == v)

return tu[y]

+ g[v]

[y];

for(

int i =

19; i >=0;

--i)

if(fa[u]

[i]!= fa[v]

[i])

int lca = fa[u][0

];return

min(g[lca][0

]+ f[lca][0

]- f[u][1

]- f[v][1

]+ tu[1]

+ tv[1]

, g[lca][1

]+ f[lca][1

]-min(f[u][0

], f[u][1

])-min

(f[v][0

], f[v][1

])+min

(tu[0]

, tu[1]

)+min(tv[0]

, tv[1]

));}

intmain()

dfs(1,

0);dfs2(1

);for(

int i =

1; i <= n;

++i)

for(

int j =

1; j <20;

++j)

for(

int i =

1; i <= n;

++i)

}while

(q--

)return0;

}

Luogu5024 保衛王國

f 表示以 u 為根的子樹中,u 不取的最小開銷 f 表示以 u 為根的子樹中,u 必取的最小開銷 g 表示以 u 為根的子樹中,不取重兒子,且 u 不取的最小開銷 g 表示以 u 為根的子樹中,不取重兒子,且 u 必取的最小開銷 設 u 的重兒子為 w f g f f g min f f 轉化方程...

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,複雜...