重心定义:去掉重心后,树分成若干个连通块,要使最大连通块最小\color{Red}重心定义:去掉重心后,树分成若干个连通块,要使最大连通块最小重心定义:去掉重心后,树分成若干个连通块,要使最大连通块最小

考虑x为根的树和x的一些儿子y考虑x为根的树和x的一些儿子y考虑x为根的树和x的一些儿子y

现在已知y为根的子树的重心s,如何递推到x为根的子树?现在已知y为根的子树的重心s,如何递推到x为根的子树?现在已知y为根的子树的重心s,如何递推到x为根的子树?

这么想,y子树−>s子树的过程中,也就是在y的头上加了x和x的其他儿子这么想,y子树->s子树的过程中,也就是在y的头上加了x和x的其他儿子这么想,y子树−>s子树的过程中,也就是在y的头上加了x和x的其他儿子

也就是如果把s砍掉,头上的那个连通块比以前大也就是如果把s砍掉,头上的那个连通块比以前大也就是如果把s砍掉,头上的那个连通块比以前大

假如头上那个连通块不是最大的,那位置s为重心一定最优

假如头上的连通块变成最大的,那把s往上跳,最大连通块会变小,答案会变优

所以每次尝试往上跳就行了

#include <bits/stdc++.h>
using namespace std;
const int maxn=6e5+10;
int rt[maxn],sz[maxn],mx[maxn],fa[maxn],n,m;
struct p{int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){d[cnt]=(p){v,head[u]},head[u]=cnt++;
}
void dfs(int now,int pre)
{sz[now]=1;for(int i=head[now];i;i=d[i].nxt){dfs( d[i].to,now );sz[now]+=sz[d[i].to];mx[now]=max(mx[now],sz[d[i].to]);}int me=mx[now];rt[now]=now;for(int i=head[now];i;i=d[i].nxt){int it=rt[ d[i].to ];int nice=max( mx[it],sz[now]-sz[it] ),k=it;while( fa[it]!=now ){it=fa[it];//往上跳int nn=max( mx[it],sz[now]-sz[it]);if( nn<nice ) nice=nn,k=it;else break;//不会更优秀了 }if( me>nice ){me=nice;rt[now]=k;}}
}
int main()
{cin >> n >> m;for(int i=2;i<=n;i++){cin >> fa[i];add(fa[i],i);}dfs(1,0);while( m-- ){int x; cin >> x;cout << rt[x] << '\n';}return 0;
}

B. Kay and Snowflake(重心的性质)相关推荐

  1. 【luogu CF685B】Kay and Snowflake(树的重心)

    Kay and Snowflake 题目链接:luogu CF685B 题目大意 给你一棵有根数根为 1,然后要你求每个子树的重心. 如果有多个重心输出其中一个即可. 思路 有一个性质:如果一个点是一 ...

  2. Codeforces - Kay and Snowflake

    题目链接:Codeforces - Kay and Snowflake 有一个很重要的点: 一个子树的重心,只会在本身或者重儿子当中产生. 所以先判断当前点能否作为重心,然后不然,就从重儿子的重心往上 ...

  3. ACM-树重心的性质及动态维护

    本文转自http://fanhq666.blog.163.com/blog/static/81943426201172472943638/ 求树重心的方法:(NlogN) http://www.cnb ...

  4. Codeforces Round #359 (Div. 2) D. Kay and Snowflake

    题目链接:传送门 题目大意:给你n个点,n-1条边连接所有点构成一棵树,1是树根,有m次询问,对于每次询问的点x,在x及x的子树中找出一个点,使删去这个点,所得包含元素最多的联通分块 所含有的点的个数 ...

  5. C. Link Cut Centroids(树的重心性质)

    题意: 对于一棵树 删除一条边再加上一条边使得新树只有一个重心 输入 输入由多个测试案例组成.第一行包含一个整数t(1≤t≤104)--测试案例的数量.测试用例的描述如下. 每个测试用例的第一行包含一 ...

  6. 树的直径/重心 学习笔记

    树的直径 POJ2631 Roads in the North 题意:裸的直径 题解:套模板,但是开始的时候,我的代码在第一次dfs循环的时候,没有考虑到,路长全为0的情况,而用来记录最远点的maxp ...

  7. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  8. M - Kill the tree 计蒜客 - 42552(2019icpc徐州/树的重心/树形dp)

    vj地址 题目大意:找到每一颗子树的重心 思路: 树的重心的性质: 树的重心如果不唯一,则至多有两个,且这两个重心相邻 通过连接一条端点分别在两个树的边,来将两个树合并成一个,那么新的重心肯定是在原来 ...

  9. [ZJOI2015] 幻想乡战略游戏(树链剖分 + 线段树二分 + 带权重心)

    problem luogu-P3345 solution 这是一个带权重心的题,考察动态点分治.点分治?呵,不可能的,这辈子都不可能写点分治 我们重新考虑重心的性质:以这个点为根时,所有子树的大小不会 ...

  10. P4299 首都(LCT、重心)

    解析 动态维护树的重心 关键性质:两棵树合并时,新的重心一定在两个原重心之间的路径上 把两个重心之间的路径提出来,利用splay本身的二叉结构二分即可 注意虚子树信息的处理 不要忘记pushdown ...

最新文章

  1. 比亚迪f3android系统,比亚迪F3发动机防盗系统设定
  2. 用java编写简单Webserver,理解webserver的功能。
  3. 情人节脱单必备,程序员如何花式表白
  4. JavaScript---Ajax和函数回调,异步编程
  5. c均值算法的设计与实现_如何使用C链表实现 LRU 算法
  6. 【深度学习】Batch Normalization详解
  7. jquery 对象 和 js 对象 为什么要互相转换?_JQuery对象与dom对象两者之间的相互转换...
  8. 社区活动 | Apache RocketMQ × Apache Flink Meetup · 上海站
  9. 如何将MID音乐转换成MP3
  10. Android GMS认证总结01
  11. gee学习2数据获取、数据筛选、创建地理要素
  12. 项目组数据库脚本的维护方案
  13. 分享一个无需账号完全免费的 ChatGPT-4 的方法
  14. 谷歌高级架构师十年心血终成Kubernetes微服务实战文档
  15. OpenCV快速入门一:图片读取保存
  16. 12月份参加工作的年假怎么休_12月份满一年的,年假必须在12月份休完吗?
  17. 本科毕设论文如何写(1)-- 快速下手
  18. Java面向对象试题
  19. viper4android耳机爆音,利用ViPER4Android FX音效驱动提升耳机音质
  20. 如何判断我们的代理ip是高匿

热门文章

  1. me909嵌入式linux,linux4.1.4上移植ME909s-821,MU609 4G模块驱动
  2. Android Application创建到Activity启动(launcher启动和startActivity启动)
  3. 【无标题】智慧校园管理系统-毕设项目(包含数据库)
  4. 你还不知道高情商表现怎么表现?
  5. html5 按钮效果,7款外观迷人的HTML5/CSS3 3D按钮特效
  6. 关于monitor模式
  7. win2003 序列号
  8. 高效的敏捷测试第八课 静态测试工具和生成测试报告
  9. 【爬虫】IP代理池的总结、实现与维护,IP代理池小工具(小框架),自建代理ip池
  10. PCI驱动的注册和初始化