题目链接:

http://codeforces.com/contest/1187/problem/E

题意:

给出一颗树,找到一个根节点,使所有节点的子节点数之和最大

数据范围:

$2 \le n \le 2 \cdot 10^5$

分析:

最暴力的方法是枚举所有的根节点,计算他们子节点之和,复杂度是$O(n^2)$

但是可以发现,$a$作为根节点和$b$作为根节点,只有$a,b$节点的子节点数有变化

根的子节点数肯定是$n$,与他交换的点节点数是$x$的话,那么根的子节点数就变成$n-x$,交换点就变成$n$,前提是交换点与根是相邻的

1.先以$1$作为根节点,计算出每个节点的子节点数,并且算出$1$节点第一个涂色的答案

2.把根节点变成与$1$相邻的点,计算答案,取最大值

3.往后递归

ac代码:

#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
const int maxn=2e5+10;
const ll mod=1e9+7;
vector<int>ve[maxn];
int num[maxn],n;
ll sum,ans;
bool vis[maxn];
int dfs1(int x)
{
num[x]=1;
for(int i=0;i<ve[x].size();i++)
{
int v=ve[x][i];
if(vis[v]==0)
{
vis[v]=1;
num[x]+=dfs1(v);
}
}
sum+=num[x];
return num[x];
}
void dfs2(int x,int f)
{
sum+=(n-2*num[x]);
num[f]=n-num[x];
num[x]=n;
ans=max(sum,ans);
for(int i=0;i<ve[x].size();i++)
{
int v=ve[x][i];
if(vis[v]==0)
{
vis[v]=1;
dfs2(v,x);
}
}
sum+=(n-2*num[f]);
num[x]=n-num[f];
num[f]=n;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n-1;i++)
{
int a,b;
scanf("%d %d",&a,&b);
ve[a].push_back(b);
ve[b].push_back(a);
}
vis[1]=1;
dfs1(1);
ans=sum;
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=0;i<ve[1].size();i++)
{
int v=ve[1][i];
vis[v]=1;
dfs2(v,1);
}
printf("%lld\n",ans);
return 0;
}

  

codeforces#1187E. Tree Painting(树换根)的更多相关文章

  1. CF1187E Tree Painting【换根dp】

    题目传送门 题意 一棵$N$个节点的树,初始时所有的节点都是白色,第一次可以选择任意一个把它涂成黑色.接下来,只能把与黑色节点原来相连的白色节点涂成黑色(涂成黑色的点视为被删去,与其它节点不相连).每 ...

  2. Codeforces 1187E - Tree Painting(树上所有节点的儿子数量和最大)

    乍一看题意比较麻烦,好像要删点求联通性,但其实是相当于求以某一个节点为根时,他的所有后代(儿子,儿子的儿子等等)的儿子的总和最大. 两边dfs即可,第一遍dfs随便找一个点为根,求出每个节点的儿子数s ...

  3. CodeForces 1110F Nearest Leaf | 线段树/换根

    我--又诈尸了-- 代码几乎都不会写了,打场CF居然上分啦,开心!(虽然还是比不过列表里的各路神仙) 题目链接 题目描述 一棵\(n\)个点的有根树,规定一种dfs序(规则:编号小的点优先dfs),\ ...

  4. CodeForces 825G"Tree Queries"(选根建树)

    传送门 •参考资料 [1]:CodeForces 825G Educational Round #25 G :建树选根大法+O1大法+iostream解绑了还是慢 •题意 给定一颗包含 n 个节点的树 ...

  5. Codeforces 23E Tree(树型DP)

    题目链接 Tree $dp[x][i]$表示以x为根的子树中x所属的连通快大小为i的时候 答案最大值 用$dp[x][j]$ * $dp[y][k]$ 来更新$dp[x][j + k]$. (听高手说 ...

  6. Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost 【DFS换根 || 树形dp】

    传送门:http://codeforces.com/contest/1092/problem/F F. Tree with Maximum Cost time limit per test 2 sec ...

  7. Jamie and Tree CodeForces - 916E (换根)

    大意: n节点树, 每个点有权值, 三种操作: 1,换根. 2, lca(u,v)的子树权值全部增加x. 3, 查询子树权值和. 先不考虑换根, 考虑子树x加v的贡献 (1)对fa[x]到根的树链贡献 ...

  8. Codeforces 1092 F Tree with Maximum Cost (换根 + dfs)

    题意: 给你一棵无根树,每个节点有个权值$a_i$,指定一个点u,定义$\displaystyle value = \sum^v a_i*dist(u,v)$,求value的最大值 n,ai<= ...

  9. E. Tree Painting(树形换根dp)

    http://codeforces.com/contest/1187/problem/E 分析:问得分最高,实际上就是问以哪个节点出发得到的分数最多,而呈现成代码形式就变成了换根,max其得分!!!而 ...

随机推荐

  1. Win10怎么添加开机启动项?Win10添加开机自动运行软件三种方法

    Win10管理开机启动项的方法相信大家已经非常熟悉,msconfig命令各系统都通用,那么很多用户发觉Win10和Win7 XP等系统不同,没有启动文件夹,那么我们怎么添加开机启动项呢?如晨软件或程序 ...

  2. C#picturebox控件图片以json格式上传java后台保存

    关于winform上传图片到Java后端,保存到数据库,有多种方法,本文主要介绍利用picturebox控件,点击按钮上传图片,将图片转化为base64格式,以json格式上传到Java后台,再从ja ...

  3. 2017JAVA面试题附答案

    JAVA基础 JAVA中的几种基本类型,各占用多少字节?   String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变.平 ...

  4. ORACLE_笔记_练习题目

    一.plsql用法网址及时复习 extract()函数----用于截取年.月.日.时.分.秒 https://www.cnblogs.com/xqzt/p/4477239.html case when ...

  5. c++ 二叉树的遍历(迭代,递归)

    #include<iostream> #include <algorithm> #include <vector> #include <set> #in ...

  6. 使用EasyUI查询与删除

    下面我们创建一个使用EasyUI布局的asp.net网站查询与删除数据(连接数据库) 新建网站-新建数据库(一个表,主要作用是了解一下easyUI的使用) 打开EasyUI帮助文档,自行渲染 使用da ...

  7. DA_01_linux_物理机局域网工作机制

    一:物理机局域网工作机制: 二:域名服务的工作流程: 首先通过域名映射到IP地址,如果没有找到域名,向外部服务器DNS查询,然后通过IP地址访问服务器: 三:Vmware--NAT虚拟网络配置:

  8. VSCode 快捷键定义

    默认的 Toggle explore side bar 快捷键为 Ctrl + B, 但是这和 Vim 的快捷键冲突,解决方法: File  >  Preferences  >  Keyb ...

  9. 算法---FaceNet在Tf下的实战篇

    FaceNet---Tensorflow下的下的实战篇 @WP20190225 ===============目录=============== 一.FaceNet算法简介 二.FaceNet配置与使 ...

  10. PHPStorm 3.3 破解方法 以及汉化

    第一步修改host文件(host文件地址为): C:\Windows\System32\drivers\etc 将以下内容添加到host文件里面     0.0.0.0 account.jetbrai ...