原題傳送門
這裡不講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,複雜...