JSOI2018 潛入行動

2022-07-26 12:30:22 字數 1082 閱讀 7862

題目鏈結

參考題解

注意題面:在當前節點設定監聽裝置不能監聽到節點本身。那麼節點能否被覆蓋和節點是否設定監聽裝置需要分開設。

設 \(f_\) 表示以第 \(i\) 個節點為根的子樹,除了 \(i\) 以外的節點都已經被覆蓋,\(i\) 號節點有沒有設定監聽裝置、有沒有被覆蓋的方案數。

轉移方程:

\[f_= \sum f_ * f_

\]\[f_= \sum f_ * (f_ + f_) + f_ * f_

\]\[f_= \sum f_ * (f_ + f_)

\]\[f_= \sum f_ * (f_ + f_) + f_ * (f_ + f_ + f_ + f_)

\]dp 過程中為了防止 f 值改變造成答案混亂,在 dp 之前用 g 陣列記錄一下 f 陣列的初值即可。

注意:本題卡空間,f 陣列需要定義為 int,在 dp 時再強轉為 long long。以及,取膜的時候不要 + mod,會炸掉的,具體為什麼我也不知道 qwq

#include #include #include #include #define rint register int 

#define ll long long

using namespace std;

const int n = 100010, mod = 1000000007;

struct edge e[n << 1];

int n, k, cnt = 0, siz[n], head[n], f[n][110][2][2], g[110][2][2];

void add(int x, int y) ; head[x] = cnt; }

int mod(ll x, ll y)

void dfs(int x, int fa)

for(rint j = 0; j <= min(siz[x], k); j++)

}siz[x] += siz[v];

}}int main()

JSOI2018 潛入行動

題目 我好菜啊,嚶嚶嚶 原來本地訪問陣列負下標不會報 re 或者 wa 甚至能跑出正解啊 這道題還是非常呆的 我們發現 k 很小,於是斷定這是乙個樹上揹包 發現在乙個點上安裝控制器並不能控制這個點,可能需要到父親那邊才能控制這個點,於是我們設 dp i j 0 1 0 1 表示在以 i 為根的子樹裡...

JSOI2018 潛入行動

一棵 n n le10 5 個結點的樹,在一些點上安裝 k k le min n,100 個裝置。每個裝置可以控制所有與安裝位置相鄰的結點 不包括本身 每個點可以安裝至多乙個裝置。問有多少種方案恰好用完 k 個裝置,使得所有的結點都被控制。樹形dp。f i j 0 1 0 1 表示以 i 為根的子樹...

JSOI2018 潛入行動

一道思路不難但是寫起來很麻煩的樹形揹包 我們發現每個節點有很多資訊需要保留 所以就暴力的設 f u j 0 1 0 1 表示點u的子樹分配了j個監察器,點u有沒有被控制,點u放沒放監察器 然後就分四種情況暴力討論就好了 注意揹包的時候要卡常數 include include include incl...