首页 > 其他分享 >P9021 [USACO23JAN] Subtree Activation P

P9021 [USACO23JAN] Subtree Activation P

时间:2024-10-12 18:01:43浏览次数:1  
标签:tmp head min int siz Activation P9021 USACO23JAN dp

P9021 [USACO23JAN] Subtree Activation P

这种看上去就很不常规的东西不用想着怎么构造最佳方案,这条路一定是行不通的,考虑转化题意。

考虑变化的实质只有两种:全 \(0\) 状态和 \(x\) 子树全满的状态转化;\(x\) 子树全满和 \(y\) 子树全满的状态转化,其中 \(x,y\) 有边。这样的状态转化描述起来十分抽象,于是考虑形象化地建图描述。

于是考虑建新图 \(G\)。对于 \((x,y)\),\(G\) 上连边权为 \(|siz_x-siz_y|\) 的边,同时将每个 \(x\) 连 \((0,x)\),边权为 \(siz_x\)。这样一来问题似乎转化为了在新图上找到一个欧拉图覆盖所有的点且使边权最小。

\(n\le 2\times 10^5\),考虑 \(O(n)\) 的做法,就只有树形 dp 了。在我们的描述中 \(0\) 号节点很关键,考虑删掉 \(0\) 号点后这个欧拉图形成了若干个联通块,这些个联通块都是链状的,只会有两个顶点可能与 \(0\) 相连,具体地,有 \(0\le p \le 2\) 条边和 \(0\) 号节点相连,通过 \(0\) 首尾相接。于是它设进 dp 状态中。具体地,设 \(dp_{x,0/1/2}\) 表示删掉 \(x\) 后所在联通块两个顶点有 \(0/1/2\) 个和 \(0\) 号点相连的最小花费,令 \(z=siz_x-siz_y\),初始情况显然是 \(dp_{x,0}=0,dp_{x,1}=siz_x,dp_{x,2}=2\times siz_x\)。方程是容易列出的:

\[\begin{gather*} dp_{x,0}\leftarrow \min\{dp_{x,0}+dp_{y,0}+2z,dp_{x,0}+dp_{y,2}\}\\ dp_{x,1}\leftarrow \min\{dp_{x,1}+dp_{y,0}+2z,dp_{x,0}+dp_{y,1}+z,dp_{x,1}+dp_{y,2}\}\\ dp_{x,2}\leftarrow \min\{dp_{x,2}+dp_{y,0}+2z,dp_{x,0}+dp_{y,2}+2z,dp_{x,1}+dp_{y,1}+z,dp_{x,2}+dp_{y,2}\} \end{gather*} \]

所求显然是 \(dp_{1,2}\)。

代码:

#include <bits/stdc++.h>
#define N 200005
using namespace std;
int n;
struct Node {
	int to, nxt;
} e[N];
int head[N], cnt;
void add(int u, int v) {
	e[++cnt].to = v;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}
int dp[N][3];
int siz[N];
void dfs(int x) {
	siz[x] = 1;
	for (int i = head[x]; i; i = e[i].nxt) {
		int y = e[i].to;
		dfs(y);
		siz[x] += siz[y];
	}
	dp[x][0] = 0, dp[x][1] = siz[x], dp[x][2] = 2 * siz[x];
	for (int i = head[x]; i; i = e[i].nxt) {
		int y = e[i].to;
		int z = siz[x] - siz[y];
		int tmp[3];
		tmp[0] = min(dp[x][0] + dp[y][0] + 2 * z, dp[x][0] + dp[y][2]);
		tmp[1] = min({dp[x][1] + dp[y][0] + 2 * z, dp[x][0] + dp[y][1] + z, dp[x][1] + dp[y][2]});
		tmp[2] = min({dp[x][2] + dp[y][0] + 2 * z, dp[x][0] + dp[y][2] + 2 * z, dp[x][1] + dp[y][1] + z, dp[x][2] + dp[y][2]});
		for (int j = 0; j < 3; j++)
			dp[x][j] = tmp[j];
	}
}
int main() {
	cin >> n;
	for (int i = 2, x; i <= n; i++)
		scanf("%d", &x), add(x, i);
	dfs(1);
	cout << dp[1][2] << "\n";
	return 0;
}

标签:tmp,head,min,int,siz,Activation,P9021,USACO23JAN,dp
From: https://www.cnblogs.com/Rock-N-Roll/p/18461134

相关文章

  • P9020 [USACO23JAN] Mana Collection P 题解
    P9020[USACO23JAN]ManaCollectionP题解首先考虑对于长为\(d\les\)的最优路径,最优的方法一定是先在起点等\(s-d\)秒再走以确保收集到的最大。\(n\le18\)我们显然考虑状压dp。考虑最大法力值难以计算,正难则反,考虑使未被选择的最小。于是我们设\(dp_{sta,i}\)表示状......
  • [USACO23JAN] Tractor Paths P 题解
    T4[USACO23JAN]TractorPathsP唯二的两道蓝题之一,但难度至少紫黑之间。思路是这篇题解的。首先一个贪心:跳到与当前区间相连的最靠右的区间肯定是最优的,由此倍增易得第一问。重点在于第二问的求解,我们发现这个东西很麻烦,这时候就需要一些寄巧了。具体来说,前人之述备矣。坑点:D......
  • P9019 [USACO23JAN] Tractor Paths P 题解
    P9019[USACO23JAN]TractorPathsP题解难度其实绝对不止蓝题。先考虑第一问。维护任意两点之间的最短路是困难的,难以dp或是采取其它方法解决。难以算最短路就转换思路,考虑从\(x\)走\(p\)步能走到哪。考虑到这个东西是有单调性的,也就是说对于\(x<y<z\),从\(x\)能走到......
  • Microsoft Activation Scripts
    Open-sourceWindowsandOfficeactivatorfeaturingHWID,Ohook,KMS38,andOnlineKMSactivationmethods,alongwithadvancedtroubleshooting.Method1-PowerShell(Windows8andlater)❤️OpenPowerShell(NotCMD).Todothat,right-clickontheWindows......
  • 每天认识几个maven依赖(acegisecurity+activation+activecluster+activeIO)
    四、acegisecurity1、是什么?acegisecurity是早期版本的SpringSecurity框架的名称。SpringSecurity是一个功能强大的认证和授权框架,用于保护Java应用程序的安全性。acegisecurity这个名称来源于它的前身项目AcegiSecurity。2、有什么用?认证:验证用户的身份,确保......
  • 【论文阅读】TBA Faster Large Language Model Training Using SSD Based Activation
    摘要GPU内存容量的增长速度跟不上大型语言模型(llm)的增长速度,阻碍了模型的训练过程。特别是,激活——在前向传播过程中产生的中间张量,并在后向传播中重用——主导着GPU内存的使用。为了应对这一挑战,我们建议TBA将激活有效地卸载到高容量NVMessd上。这种方法通过自适应地将数据传......
  • Microsoft-Activation-Scripts
    Microsoft-Activation-Scriptskeywords:windowsoffice激活MicrosoftActivationScripts(MAS)AWindowsandOfficeactivatorusingHWID/Ohook/KMS38/OnlineKMSactivationmethods,withafocusonopen-sourcecodeandfewerantivirusdetections.官网:htt......
  • 微云verification-activation code
    1.进入微云新建一个文件夹2.新建一个文件,随便命名,如"激活码集合"3.分享链接图中框起来的就是验证码了4.特征字举例这里采用代码展示总结思路如果要使其过期,只需要将文件改个名字即可,或者不包含"激活码集合"全部代码展示效果展示文件名包含"激活码集合"文......
  • COMP9021 Principles of Programming
    COMP9021PrinciplesofProgrammingTerm2,2024Assignment2Worth13marksanddueWeek11Monday@10amGeneralMatters1.1AimThepurposeofthisassignmentisto:Developyourproblem-solvingskills.Designandimplementthesolutiontoapr......
  • COMP9021 Principles of Programming Coding Quiz 5
     COMP9021PrinciplesofProgrammingTerm2,2024CodingQuiz5Worth4marksanddueWeek8Thursday@9pmDescriptionYouareprovidedwithastubinwhichyouneedtoinsertyourcodewhereindicatedwithoutdoinganychangestotheexistingcode......