LG5024 保衛王國

2022-04-29 06:27:05 字數 1871 閱讀 3189

給定一棵\(n\)個點的樹,每個點的代價為\(a_i\),每條邊至少有乙個端點要被選。

\(m\)次詢問,規定\(x\)和\(y\)選或不選,求覆蓋整棵樹的最小權值。

考場上拿掉\(44pts\)就放棄了

下文中的\(u\)為子節點。

這是不是非常顯然:

\(dp[x][0/1]\)表示第\(x\)個點不選/選時的最小代價

每次詢問時把\(dp[x][1-tx]\)、\(dp[y][1-ty]\)變為\(inf\),\(o(n)\)再做一遍就好

那麼我們發現,這樣子做有許多是無用功,其實改變了的只是\(x\)到\(y\)這條路徑。

高階來了:發現有一些\(b\)類的,那麼暴力跳鏈,再維護整棵樹除了某棵子樹外的答案,加起來就好了。

定義\(ndp[x][0/1]\)表示第\(x\)個點不選/選時除了\(x\)這棵子樹外的最小代價(不包括\(x\)點)

接下來考慮瓶頸:跳鏈的部分如何來優化

其實是可以倍增的

\(dp[x][i][p][q]\)表示從第\(x\)個點(狀態為\(p\))到\(x\)的\(2^i\)個父親(狀態為\(q\))的答案

注意這個是父親的子樹-\(x\)的子樹的答案,因為這樣轉移時方便,且最後對\(sum_鏈+dp[x][tx]+dp[y][ty]+ndp[lca][0/1]\)討論就好

轉移列舉中間點的情況:

\(dp[j][i][p][q]=min(dp[j][i-1][p][0]+dp[f][i-1][0][q],dp[j][i-1][p][1]+dp[f][i-1][1][q]);\)

最後求答案,基本跟倍增求\(lca\)一樣,看**吧(暴露懶的本性)

#include using std::min;

using std::swap;

const long long inf=10000000000;

const int n=100005;

int to[n<<1],edge,last[n],next[n<<1],a[n],deep[n],n,x,y,tx,ty,m;

char s[3];

long long dp[n][2],ndp[n][2],fa[n][21],dp[n][21][2][2],fx[2][2],fy[2][2];

void add(int x,int y)

void dfs(int x)

}void dfs2(int x)

}void pre()

for (int i=1;i<=20;i++)

for (int j=1;j<=n;j++)

} long long solve(int x,int tx,int y,int ty)

if (x==y) return fx[flag][ty]+ndp[y][ty];

fy[flag][1-ty]=inf,fy[flag][ty]=dp[y][ty];

for (int i=20;i>=0;i--)

if (fa[x][i]!=fa[y][i])

int f=fa[x][0];

long long sum0=fx[flag][1]+fy[flag][1]+dp[f][0]-dp[x][1]-dp[y][1];

long long sum1=min(fx[flag][1],fx[flag][0])+min(fy[flag][0],fy[flag][1])+dp[f][1]-min(dp[x][0],dp[x][1])-min(dp[y][0],dp[y][1]);

return min(sum0+ndp[f][0],sum1+ndp[f][1]);

}int main()

}

或許我的\(blog\)已經咕了兩個月了(可能下一次就是一百年後了),覺得我退化了啊,比去年還菜了啊

Luogu5024 保衛王國

f 表示以 u 為根的子樹中,u 不取的最小開銷 f 表示以 u 為根的子樹中,u 必取的最小開銷 g 表示以 u 為根的子樹中,不取重兒子,且 u 不取的最小開銷 g 表示以 u 為根的子樹中,不取重兒子,且 u 必取的最小開銷 設 u 的重兒子為 w f g f f g min f f 轉化方程...

題解 LuoGu5024 保衛王國

原題傳送門 這裡不講ddp,用倍增優化樹形dp解決 前兩者可以直接遍歷求得,dpdp dp陣列可以倍增預處理的時候求得 對於每個詢問,要看兩個點u,v u,vu,v能影響到的區域 模仿倍增求lca lcalc a若u,vu,v u,v到根的鏈為同一條,則影響部分就是u uu到v vv若不是同一條,則...

P5024 保衛王國 倍增 dp

窩當然不會ddp啦,要寫這題當然是考慮優化裸dp啦,但是這題非常麻煩,於是變成了黑題。首先,這個是沒有上司的舞會模型,求圖的帶權最大獨立集。不考慮國王的限制條件,有 dp x 0 dp y 1 dp x 1 min dp y 1 dp y 0 現在考慮限制條件,如果對每乙個限制條件都做一次dp,複雜...