NOIP2018 保衛王國 動態dp

2022-05-03 19:06:09 字數 2059 閱讀 4284

此題場上打了乙個正確的$44pts$,接著看錯題瘋狂$rush$「正確」的$44pts$,後來沒$rush$完沒將之前的**$copy$回去,直接變零分了。。。。。

這一題我們顯然有一種$o(nm)$的做法

令$f[u][0]$表示在以$u$為根的子樹內部署軍隊,且$u$不部署軍隊的最小代價。

令$f[u][1]$表示在以$u$為根的子樹內部署軍隊,且$u$部署軍隊的最小代價。

結合題意(重要!)不難推出:

$f[u][0]=\sum_ f[v][1]$

$f[u][1]=val_u+\sum_ min(f[v][0],f[v][1])}$

考慮滿足能選/不能選的要求,我們只需要臨時將被選擇點的權值賦值為$inf$或$-inf$即可。

考慮這棵樹是一條鏈的情況:我們用一棵線段樹,每個節點維護乙個答案矩陣(該區間左端點駐軍/可能不駐軍,該區間右端點駐軍/可能不駐軍時的最小代價)。我們求乙個節點的答案矩陣,顯然可以通過其兒子的答案矩陣,通過大力分類討論(詳見**)實現更新。

當出現修改權值的情況時,大力改一改然後$pushup$即可。

我們考慮將這乙個鏈上做法擴充套件到樹上。我們用樹鏈剖分將整棵樹剖成若干條鏈,對於輕邊上的一對節點$(u,son[u])$,我們將$son[u]$所在鏈的資訊加入節點$u$所對應答案矩陣內即可(詳見**)。

一遍過樣例開了$o2$就過了美滋滋

1 #include2

#define mid ((a[x].l+a[x].r)>>1)

3#define l long long

4#define inf (1ll<<50)

5#define low (1ll<<40)

6#define m 100005

7using

namespace

std;89

struct edgee[m*2]=; int head[m]=,use=0;10

void add(int x,int y)

1112

int siz[m]=,dfn[m]=,rec[m]=,top[m]=,dn[m]=,son[m]=,fa[m]=,t=0;13

14void dfs(int

x)22}23

void dfs(int x,int

top)

2930 l f[m][2]=,val[m]=;

31void dp(int

x)38}39

40struct

mat42 mat(l x)

43 mat(l a1,l a2,l a3,l a4)

44 l ans()

45void upd(l now)

46 friend mat operator *(mat a,mat b)

55return

c;56}57

}wei[m];

58struct sega[m<<2

];59

void pushup(int x)

6061

void build(int x,int l,int

r)70 a[x].s=wei[l]=mat(g1,g1,g1,g0);

71return;72

}73 build(x<<1,l,mid); build(x<<1|1,mid+1

,r);

74pushup(x);75}

76 mat query(int x,int l,int

r)82 mat query(int x)

83 l solve()

8485

void updata(int x,int

k)90

void updata(int

x,l val)

106}

107108

109int n,m; char op[10

];110

111int

main()

140 printf("

%lld\n

",res);

141}

142 }

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