兩隻 \(\log\) 的動態 \(dp\) !
相比標算倍增
動態 \(dp\) 既實用又好理解
#include#include#define ls (p << 1)
#define rs (ls | 1)
using namespace std;
typedef long long ll;
const int n = 1e5 + 5;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n, m, p[n];
char type[10];
ll f[n][2], g[n][2];
int h[n];
struct edgee[n << 1];
inline void add(int x, int y)
, h[x] = tot;
}struct matrix
inline matrix operator*(const matrix &b)
}seg[n << 2];
inline matrix i()
inline matrix node(ll g0, ll g1)
int fa[n], son[n], siz[n], top[n], bot[n], dfn[n];
void dfs1(int x)
}void dfs2(int x)
}void update(int p, int l, int r, int x, matrix v)
matrix query(int p, int l, int r, int tl, int tr)
inline void change(int x)
}int main()
}
但如果兩隻 \(\log\) 被卡了呢?
一種比較優秀的卡常方法是對於每條重鏈開一顆線段樹維護
然後跳的時候詢問可直接獲取
#include#includeusing namespace std;
typedef long long ll;
const int n = 1e5 + 5;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n, m, p[n];
char type[10];
ll f[n][2], g[n][2];
int h[n];
struct edgee[n << 1];
inline void add(int x, int y)
, h[x] = tot;
}int fa[n], son[n], siz[n], top[n], bot[n], dfn[n];
void dfs1(int x)
}void dfs2(int x)
}struct matrix
inline matrix operator*(const matrix &b) };
inline matrix i()
inline matrix node(ll g0, ll g1)
struct nodeseg[n << 2];
int rt[n];
void build(int &p, int l, int r)
void update(int p, int l, int r, int x, matrix v)
inline void change(int x)
}int main()
}
NOIP2018 保衛王國
題目 強制選點我們可以把那個點權搞成 inf 強制不選我們搞成 inf 之後就真的成為動態 dp 的板子題了 由於不想像板子那樣再寫乙個最大獨立集的方程,之後利用最小點覆蓋 總點權 最大獨立集的做法,而直接寫了乙個最小點覆蓋的方程,所以寫出了很多鍋 矩陣裡存放相同意義變數的位置可能真實值不相等,於是...
NOIP2018 保衛王國
給定一棵樹,求它的最小點權覆蓋集,其中允許強制某個點選或不選 ddp用lct維護 明確乙個關係式 最小點權覆蓋集 全集 最大點權獨立集 那麼n 2000的暴力就很簡單了,暴力修改,然後求最大點權獨立集就好了 我在考場上就是這麼寫的 關於正解,我採用的是動態dp 動態dp的題解點這裡 根據上面的式子,...
NOIP2018 保衛王國(動態DP)
求最小權值點覆蓋。m mm次詢問,每次給出兩個點,分別要求每個點必須選或必須不選,輸出每次的最小權值覆蓋或者無解輸出 1 1 1強制選或者不選可以看做修改權值為 pm infin 那麼就是這道板題了。include using namespace std typedef long long ll t...