Codeforces Round #359 (Div. 2) D. Kay and Snowflake
来源:互联网 发布:网络增值业务许可证 编辑:程序博客网 时间:2024/06/06 00:00
重心的定义是:以这个点为根,那么所有的子树(不算整个树自身)的大小都不超过整个树大小的一半。
1.树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么他们的距离和一样。
2.把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上。
3.把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
一棵树的重心是它的子树的重心和这棵树的祖宗节点连的几条线中的其中一点(2)
每推一个点所支配的子树时 它的重心是它分支的重心往上遍历当首次出现这个点支配的点的数量减去分支重心支配的点的数量小于等于这个点支配数量的二分之一时,这时往上遍历的这个点就是这棵子树的重心,此时的重心的所支配的(所有子节点的数量)保证也小于等于这棵子树点的数量的二分之一
#include<cstdio>#include<cstring>#include<vector>#include<algorithm>#include<iostream>#define maxn 300005using namespace std;int n,m;int link[maxn],fa[maxn],ans[maxn];vector<int>ve[maxn];void dfs(int pre){ link[pre] = 1; for(int i=0;i<ve[pre].size();i++) { dfs(ve[pre][i]); link[pre]+=link[ve[pre][i]]; } int ans2 = pre; bool sym = false; for(int i=0;i<ve[pre].size();i++) { int pre2 = ans[ve[pre][i]]; while((link[pre]-link[pre2])*2>=link[pre])pre2 = fa[pre2]; if(pre2!=pre) { ans2 = pre2; break; } } ans[pre] = ans2;}int main(){ scanf("%d %d",&n,&m); for(int i=2;i<=n;i++) { int pre; scanf("%d",&pre); fa[i] = pre; ve[pre].push_back(i); } dfs(1); while(m--) { int pre; scanf("%d",&pre); printf("%d\n",ans[pre]); } return 0;}
0 0
- Codeforces Round #359 (Div. 2) D. Kay and Snowflake
- Codeforces Round #359 (Div. 2) D. Kay and Snowflake
- Codeforces Round #359 (Div. 2)D. Kay and Snowflake
- Codeforces Round #359 (Div. 2) D. Kay and Snowflake
- Codeforces Round #359 (Div. 2) D. Kay and Snowflake
- Codeforces Round #359 (Div. 2)D. Kay and Snowflake
- Codeforces Round #359 (Div. 2)D. Kay and Snowflake【树的重心】
- Codeforces Round #359 (Div. 2)D. Kay and Snowflake【树的重心】
- Codeforces Round #359 (Div. 1) B. Kay and Snowflake dfs
- Kay and Snowflake CodeForces
- Codeforces Round #359 (Div. 1) D. Kay and Eternity ★ ★ ★ ★
- Codeforces 686 D Kay and Snowflake (树重心)
- codeforces 686D. Kay and Snowflake 树的重心应用
- Codeforces 686 D Kay and Snowflake【树的重心】
- 【24.63%】【codefroces 686D】Kay and Snowflake
- Codeforces 685B Kay and Snowflake 树的重心
- Codeforces 685B Kay and Snowflake(树的重心)
- Codeforces Round #359 (Div. 2) A ~D
- ajax中的小细节
- Android 学习杂记
- HighAvailability
- 数据结构(java)----MyArrayList
- Linux-信号机制详解(一)
- Codeforces Round #359 (Div. 2) D. Kay and Snowflake
- 读书笔记-现代操作系统-7多媒体操作系统-7.5多媒体进程调度
- 入驻博客
- 初识UDP编程
- PullToRefreshListView原理解析(一)
- CSS 样式的重置 --设计一款属于自己的重置样式
- 47. Permutations II
- 241. Different Ways to Add Parentheses(重要)
- Android Studio中Intel HAXM的那些坑