NOIP2018 保衛王國(動態DP)

2022-05-07 01:33:08 字數 2370 閱讀 7149

求最小權值點覆蓋。mm

次詢問,每次給出兩個點,分別要求每個點必須選或必須不選,輸出每次的最小權值覆蓋或者無解輸出−1−

1強制選或者不選可以看做修改權值為±∞±

∞。那麼就是這道板題了。

#include

using

namespace std;

typedef

long

long ll;

template

<

class

t>

inline

void

read

(t &x)

const

int maxn =

100005

;const ll inf =

1e10

;int n, m, fir[maxn]

, nxt[maxn<<1]

, to[maxn<<1]

, cnt; ll v[maxn]

;inline

void

link

(int u,

int v)

int tmr, fa[maxn]

, dfn[maxn]

, tp[maxn]

, bt[maxn]

, son[maxn]

, sz[maxn]

, seq[maxn]

;struct mat

mat operator*(

const mat &o)

const

}t[maxn<<2]

, val[maxn]

;void

dfs1

(int u,

int ff)

}ll f[maxn][2

];void

dfs2

(int u,

int top)

voiddp(

int u)

void

build

(int i,

int l,

int r),}

};return;}

int mid =

(l + r)

>>1;

build

(i<<

1, l, mid)

;build

(i<<1|

1, mid+

1, r)

; t[i]

= t[i<<1]

* t[i<<1|

1];}

void

update

(int i,

int l,

int r,

int x)

int mid =

(l + r)

>>1;

if(x <= mid)

update

(i<<

1, l, mid, x)

;else

update

(i<<1|

1, mid+

1, r, x)

; t[i]

= t[i<<1]

* t[i<<1|

1];}

mat query

(int i,

int l,

int r,

int x,

int y)

void

modify

(int u, ll w)

}mapint,

int>

,bool

>e;

char s[10]

;int main (

) ll sum =0;

ll tmpa = v[a]

;modify

(a, v[a]

+(x ?

-inf : inf)

); sum +

=(x ?

-inf :0)

; ll tmpb = v[b]

;modify

(b, v[b]

+(y ?

-inf : inf)

); sum +

=(y ?

-inf :0)

; mat ans =

query(1

,1, n,

1, dfn[bt[1]

]);printf

("%lld\n"

,min

(ans[0]

[0], ans[1]

[0])

-sum)

;modify

(a, tmpa)

,modify

(b, tmpb);}

}

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...