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

[USACO23JAN] Subtree Activation P 题解

时间:2024-11-08 20:20:26浏览次数:2  
标签:2w 题解 Activation 子图 转化 fa USACO23JAN text siz

这种问题一看满足条件就知道,一般不用想着怎么模拟题意。考虑转化问题。

假如节点 \(u\) 满足了条件一,也就是仅有子树节点全部开启。那么我们把转化具象为:

  • 进行 \(\text{siz}_u\) 次操作直接清空;
  • 进行 \(\text{siz}_{\text{fa}(u)}-\text{siz}_u\) 次操作使 \(\text{fa}(u)\) 满足条件一;
  • 对于任意 \(v\in\text{son}_u\),进行 \(\text{siz}_u-\text{siz}_v\) 次操作使 \(v\) 满足条件一;

发现我们关注的条件只有:

  1. 清空状态和全满状态的转化;
  2. 两棵子树之间的转化。

于是考虑转化问题为:建新图,对于原图中任意的 \((u,\text{fa}(u))\) 的边,添加两条 \(\{u,\text{fa}(u),\text{siz}_{\text{fa}(u)}-\text{siz}_u\}\) 的双向边。然后对于任意一点 \(u\),添加两条 \(\{0,u,\text{siz}_u\}\) 的双向边。然后问题转化为在新图找一个点数为原图点数且边权最小的欧拉子图

这个欧拉子图找出来之后,我们发现:若删去 \(0\) 点,则这个欧拉子图形成了若干连通块,每个连通块都恰好有 \(2\) 条边与 \(0\) 点相连。

然后设计 DP 方程为:设 \(f_{u,0/1/2}\) 表示以 \(u\) 为根的子树,删掉 \(0\) 后有 \(0/1/2\) 条边满足一端是 \(0\)、另一端属于这个子树的最小花费。初始状态 \(f_{u,0}=0\),\(f_{u,1}=\text{siz}_u\),\(f_{u,2}=2\,\text{siz}_u\)。

注意方程第二维为 \(0/1\) 的情况,可以类比为当前点是连通块的一端;对于 \(2\) 的情况,则就是上文说的恰好 \(2\) 条边和 \(0\) 相连的情况。

令 \(v\in\text{son}_u\),\(w=\text{siz}_u-\text{siz}_v\)。有转移:

\[f_{u,0}\gets\min(f_{u,0}+f_{v,0}+2w,f_{u,0}+f_{v,2}) \]

可以理解为要么 \(v\) 要转移到 \(u\),这两个状态转移需要 \(2w\) 的花费;要么 \(v\) 已经是一个欧拉图,把 \(u\) 接入 \(v\) 的花费。

\[\begin{matrix} f_{u,1}\gets\min(f_{u,1}+f_{v,0}+2w,f_{u,0}+f_{v,1}+w,f_{u,1}+f_{v,2})\\[1ex] f_{u,2}\gets\min(f_{u,0}+f_{v,2}+2w,f_{u,2}+f_{v,0}+2w,f_{u,1}+f_{v,1}+w,f_{u,2}+f_{v,2}) \end{matrix} \]

和上面是同理的。

最后答案就是 \(f_{1,2}\)。复杂度做到了 \(O(n)\)。

#include<bits/stdc++.h>
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
using namespace std;

char buf[1<<20],*p1=buf,*p2=buf;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))ch=='-'&&(f=-1),ch=getchar();
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x*f;
}
constexpr int MAXN=2e5+5;
int n,head[MAXN],tot;
struct{
	int v,to;
}e[MAXN];
void addedge(int u,int v){
	e[++tot]={v,head[u]};
	head[u]=tot;
}
int siz[MAXN],f[MAXN][3];
void dfs(int u){
	siz[u]=1;
	for(int i=head[u];i;i=e[i].to) dfs(e[i].v),siz[u]+=siz[e[i].v];
	f[u][0]=0,f[u][1]=siz[u],f[u][2]=siz[u]<<1;
	for(int i=head[u],v,w,t0,t1,t2;i;i=e[i].to){
		v=e[i].v,w=siz[u]-siz[v];
		t0=min(f[u][0]+f[v][0]+2*w,f[u][0]+f[v][2]);
		t1=min({f[u][1]+f[v][0]+2*w,f[u][0]+f[v][1]+w,f[u][1]+f[v][2]});
		t2=min({f[u][2]+f[v][0]+2*w,f[u][0]+f[v][2]+2*w,f[u][1]+f[v][1]+w,f[u][2]+f[v][2]});
		f[u][0]=t0,f[u][1]=t1,f[u][2]=t2;
	}
}

int main(){
	n=read();
	for(int i=2;i<=n;++i) addedge(read(),i);
	dfs(1);
	printf("%d\n",f[1][2]);
	return 0;
}

标签:2w,题解,Activation,子图,转化,fa,USACO23JAN,text,siz
From: https://www.cnblogs.com/laoshan-plus/p/18534055

相关文章

  • 【题解】「NOIP2024模拟赛24 T2」子序列们
    【题解】「NOIP2024模拟赛24T2」子序列们https://www.becoder.com.cn/contest/5715/problem/2\(\mathcal{Description}\)给定一个0/1串\(a\),你需要生成一个长度为\(n\)的序列\(b\),其中\(b_i\)为\(a\)的一个子序列,且满足:\(|b_i|=n-i+1\);\(\foralli\in(1,n]\),\(b......
  • 题解:P11266 【模板】完全体·堆
    也算是对pb_ds库中的优先队列各种操作的科普?一些碎碎念提醒:你可以不看这部分,这部分算是作者探索未知功能的过程平常写优先队列的时候一般用不到对值进行修改或者删除的操作,所以我在看这到题的时候在想怎么才能实现题目中的操作,因为我不知道有什么成员函数可以直接获取具体哪......
  • Hive3.1.2搭建文档包含详细步骤及相关截图以及常见问题解决
    hive-3.1.2分布式搭建文档1、下载,上传,解压,配置环境变量#1、解压(解压到上级目录)tar-zxvfapache-hive-3.1.2-bin.tar.gz-C..#2、重名名mvapache-hive-3.1.2-binhive-3.1.2#3、配置环境变量vim/etc/profile#4、在最后增加配置exportHIVE_HOME=/usr/local/......
  • P1525 NOIP2010 提高组 关押罪犯 题解
    Link:P1525NOIP2010提高组关押罪犯-洛谷分析首先题目给出了罪犯与罪犯之间的矛盾关系,这让我们可以想到图或并查集。然后,题目又说了要把罪犯分入两个监狱,也就是把罪犯看作点,要把这些点分入两个集合,这很自然地可以想到二分图。再然后,市长只会去看列表中的第一个事件的影响力......
  • 题解
    最近模拟赛抽象题太多了,让他们聚一聚T1多校A层冲刺NOIP2024模拟赛18T3DBA暴力比较显然,直接数位dp就好,记搜的复杂度是\(O(n^4)\)的,用递推加前缀和优化可以优化为\(O(n^3)\),但我还是不理解\(O(n^3)\)凭啥能\(拿97pts\),虽然和正解没啥关系,但还是放一下记搜的代码:点击查看代码......
  • CF1995 题解
    B有n种物品,每种物品价格为$a_i$,数量为$c_i$。要求选取物品的方案,满足价格极差不超过1,价格总和不超过m。最大化价格总和。$n\le10^5,m\le10^{18},a_i,c_i\le10^9,a_i\neqa_j$显然只有\(x\)和\(x,x+1\)两种选择情况。\(x\)直接贪心选即可,考虑\(x,x+1\)。发......
  • ICPC23沈阳区域赛 D. Dark LaTeX vs. Light LaTeX 题解
    D.DarkLaTeXvs.LightLaTeXThe2023ICPCAsiaShenyangRegionalContest(The2ndUniversalCup.Stage13:Shenyang)给两个字符串\(s,t\),长度分别为\(n,m\),现在分别取\(s,t\)的子串\(s',t'\),合成一个新的长度为偶数的字符串\(str=s'+t'\),记\(str\)的长度为......
  • 题解:P11249 [GESP202409 七级] 小杨寻宝
    题目显然等价于问所有宝箱是否在一条链上。稍微转化一下题意,即我们现在要找到一条链,使得这条链上有宝物的节点数量尽可能多。想到这里我们发现这个和树的直径比较相似,那么我们直接大胆将深度定义为从根到这个节点上有宝箱节点的数量,然后做一遍树的直径。最后判断直径长度是否等......
  • 题解:3254. 长度为 K 的子数组的能量值
    Problem:3254.长度为K的子数组的能量值I题解:3254.长度为K的子数组的能量值给定一个数组nums和一个整数k,我们需要找出所有长度为k的子数组的“能量值”。根据题意:如果子数组是连续递增的,能量值等于子数组中的最大元素。否则,能量值为-1。以下是两种不同......
  • CF 1365 题解
    CF1365题解AMatrixGame注意到每次操作都相当于会损失一行和一列,那么最多进行可用行列较少的那一个的轮数.判断奇偶性即可,BTroubleSort手玩发现,不管一个属性的元素集合内部多么无序,都可以借助一个其它属性的元素达到有序.归纳证明特别简单.因此,一个序列可以......