題目鏈結
參考題解
注意題面:在當前節點設定監聽裝置不能監聽到節點本身。那麼節點能否被覆蓋和節點是否設定監聽裝置需要分開設。
設 \(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...