题目传送门

题意

一棵$N$个节点的树,初始时所有的节点都是白色,第一次可以选择任意一个把它涂成黑色。接下来,只能把与黑色节点原来相连的白色节点涂成黑色(涂成黑色的点视为被删去,与其它节点不相连)。每一次涂的分数为涂的这个白色节点所在的联通块里的白色节点的个数。要把这$N$个节点都涂成黑色,求能获得的最大分数。
(人工翻译+手打qwq,若有误差请告诉我)

分析

没有什么太大思路的题先乱搞

然后我们发现 我们在最开始随便把这棵树的其中一个节点涂成黑色之后,这个树的涂法就唯一确定了。涂了之后这棵树就会散成很多棵小树,如果我们把这棵树提起来,把最开始涂的那个点视作根,这棵树就变成了根的子树。而每次只能涂与黑色节点原来相连的白色节点,也就是只能涂原来根的那些儿子。而且根的儿子被涂的顺序不会影响答案(他们已经变成了不相连的联通块,先涂哪一个联通块是不会影响答案的),所以答案就确定了。

也就是说,我们从根开始涂,选取的根不同,答案就不同。那么我们将所有的节点都当作一次根,然后模拟一次,取最大值,就可以了。


但是这样的复杂度太高。
让我们先分析一下这个模拟的过程。

我们来观察这个节点:9
它被计算的情况有:删去1时,删去6时,删去7时,删去9时
也就是它的每一个爸爸或者自己被删去的时候,它都要被算入答案
所以它对答案的贡献就是它的爸爸的个数+1=深度

每个节点对答案的贡献都为它的深度
答案就是所有节点的深度和


再来考虑换根的问题
还是这张图

当根从1换到6时,6,7,8,9(也就是6的子树)的深度都要-1,而其它节点的深度都+1

所以把根从爸爸换到儿子,答案会少$size[son]$而会多$(n-size[son])$,所以我们再遍历一下这颗树,把根从爸爸换到儿子那里去,然后再计算答案,取最大值。

(2019.11.5二刷此题,重写代码)

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define N 200005
#define INF 0x3f3f3f3f
#define ll long long
int rd()
{
int f=,x=;char c=getchar();
while(c<''||c>''){if(c=='-') f=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+(c^);c=getchar();}
return f*x;
}
int n;
vector<int>G[N];
int siz[N],d[N];
ll ans,res;
void dfs(int u,int f,int dep)
{
d[u]=dep;
siz[u]=;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(v==f) continue;
dfs(v,u,dep+);
siz[u]+=siz[v];
}
res+=d[u];//以点1为根的答案(1号点工具人
}
void dfs2(int u,int f)
{
ans=max(ans,res);
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(f==v) continue;
res-=siz[v];
res+=(n-siz[v]);
dfs2(v,u);
res-=(n-siz[v]);
res+=siz[v];//回溯 也可以传成参数
}
}
int main()
{
n=rd();
for(int i=;i<n;i++)
{
int u=rd(),v=rd();
G[u].push_back(v);
G[v].push_back(u);
}
dfs(,,);
dfs2(,);
printf("%lld\n",ans);
return ;
}

Code

CF1187E Tree Painting【换根dp】的更多相关文章

  1. CodeForce - 1187 E. Tree Painting (换根dp)

    You are given a tree (an undirected connected acyclic graph) consisting of nn vertices. You are play ...

  2. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  3. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  4. 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市

    P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...

  5. 小奇的仓库:换根dp

    一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一 ...

  6. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  7. Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)

    题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次 ...

  8. bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp

    题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...

  9. codeforces1156D 0-1-Tree 换根dp

    题目传送门 题意: 给定一棵n个点的边权为0或1的树,一条合法的路径(x,y)(x≠y)满足,从x走到y,一旦经过边权为1的边,就不能再经过边权为0的边,求有多少边满足条件? 思路: 首先,这道题也可 ...

  10. [Bzoj3743][Coci2015] Kamp【换根Dp】

    Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...

随机推荐

  1. idea 使用Tomcat 部署war 和 war exploded的区别

    war模式:将WEB工程一包的形式上传到服务器中. war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器. 解析: war 模式这种可以称为是发布模式(完整的项目),将项目打成 ...

  2. JAVA排序算法(一)冒泡排序、选择排序

    /* 冒泡排序 * * 相邻的元素,两两比较.如果第一个比第二个大,就交换他们两个. 大的后移 * 对每一对相邻元素做同样的工作,这样第一轮结束后,最大值在最后一个. */ public static ...

  3. LINUX笔记之二常用命令(文件处理命令)

    一.概述 1. “.”开头的文件是隐藏文件,大小写敏感是因为用C语言编写 2. DOS中 cd..可回到父目录 在LINUX中要用cd ..(用空格) 3. 4.LINUX命令有两种:仅root可执行 ...

  4. k8s-in-aciton-3

    镜像构建过程 构建过程不是由Docker客户端进行的,而是将整个目录的文件上传到Docker守护进程并在那里进行的.Docker客户端和守护进程不要求在同一 台机器上.如果你在一台非Linux操作系统 ...

  5. k8s配置文件模板

    一,deployment Deployment为Pod和Replica Set下一代Replication Controller)提供声明式更新 1,配置示例 apiVersion: apps/v1 ...

  6. OpenCV笔记(3)(Canny边缘检测、高斯金字塔、拉普拉斯金字塔、图像轮廓、模板匹配)

    一.Canny边缘检测 Canny边缘检测是一系列方法综合的结果.其中主要包含以下步骤: 1.使用高斯滤波器,平滑图像,滤除噪声. 2.计算图像中每个像素点的梯度强度和方向. 3.应用非极大值抑制(N ...

  7. Nowcoder Removal ( 字符串上的线性 DP )

    题目链接 题意 : 给出长度为 n 的字符串.问你准确删除 m 个元素之后.能产生多少种不同的子串 分析 ( 参考博客 ):  可以考虑线性 DP 解决这个问题 试着如下定义动态规划数组 dp[i][ ...

  8. 【杂题】[AGC034F] RNG and XOR【集合幂级数】【FWT】【DP】

    Description 你有一个随机数生成器,它会以一定的概率生成[0,2^N-1]中的数,每一个数的概率是由序列A给定的,Pi=Ai/sum(Ai) 现在有一个初始为0的数X,每一轮随机生成一个数v ...

  9. HGOI20190808 省常中互测1

    Problem A  sum 给出$n$个元素的序列$\{a_i\}$,求出两个不相交连续子序列的最大元素和. 即对于$1 \leq A \leq B \leq C \leq D \leq n$最大化 ...

  10. HNOI2010 平面图判定(planar)

    题目链接:戳我 我怎么知道平面图有这个性质?? 对于一个平面图,它的边数不超过点数的\(3n-6\) 所以可以直接把边数多的特判掉,剩下的图中边数和点数就是一个数量级的了. 因为这个图存在欧拉回路,所 ...