給定一棵\(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,複雜...