题意是给你一棵树,然后询问一个点,以这个点为根节点的树的重心是多少
首先第一眼看上去感觉是维护子树信息,感觉是dfs序,但是死活想不出应该维护什么值。后来学习了下q神的方法,原来直接树形dp搞就行了呀,先算出每个子树的节点个数,然后找里面最大的一棵子树,重心必然在这棵子树上(很明显的,因为重心是删除它之后,剩下的子树里面节点最大的最小,所以重心应该是在最大的子树里面),然后必然是在最大的子树的重心的上面,这也是显然的,所以可以直接从最大的子树的重心往上,直到找到第一个点满足num[res[u]]≥num[u]−num[res[u]]num[res[u]]\ge num[u]-num[res[u]]就是答案了


代码

#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")using namespace std;
#define   MAX           300005
#define   MAXN          6005
#define   maxnode       15
#define   sigma_size    30
#define   lson          l,m,rt<<1
#define   rson          m+1,r,rt<<1|1
#define   lrt           rt<<1
#define   rrt           rt<<1|1
#define   middle        int m=(r+l)>>1
#define   LL            long long
#define   ull           unsigned long long
#define   mem(x,v)      memset(x,v,sizeof(x))
#define   lowbit(x)     (x&-x)
#define   pii           pair<int,int>
#define   bits(a)       __builtin_popcount(a)
#define   mk            make_pair
#define   limit         10000//const int    prime = 999983;
const int    INF   = 0x3f3f3f3f;
const LL     INFF  = 0x3f3f;
const double pi    = acos(-1.0);
//const double inf   = 1e18;
const double eps   = 1e-8;
const LL    mod    = 1e9+7;
const ull    mx    = 133333331;/*****************************************************/
inline void RI(int &x) {char c;while((c=getchar())<'0' || c>'9');x=c-'0';while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';}
/*****************************************************/int fa[MAX];
int num[MAX];
int res[MAX];
vector<int> v[MAX];void dfs1(int u){num[u]=1;for(int i=0;i<v[u].size();i++){int vv=v[u][i];dfs1(vv);num[u]+=num[vv];}
}void dfs2(int u){int mx=0;res[u]=u;for(int i=0;i<v[u].size();i++){int vv=v[u][i];dfs2(vv);if(num[vv]>=num[v[u][mx]]) mx=i;}if(v[u].size()>0){res[u]=res[v[u][mx]];while(res[u]!=u){if(num[res[u]]>=num[u]-num[res[u]]) break;res[u]=fa[res[u]];}}
}
int main(){int n,q;while(cin>>n>>q){for(int i=1;i<=n;i++) v[i].clear();for(int i=2;i<=n;i++){scanf("%d",&fa[i]);v[fa[i]].push_back(i);}dfs1(1);dfs2(1);while(q--){int a;scanf("%d",&a);printf("%d\n",res[a]);}}return 0;
}

Codeforces 685B Kay and Snowflake(树形dp)相关推荐

  1. CodeForces - 1324F Maximum White Subtree(树形dp)

    题目链接:点击查看 题目大意:给出 n 个点组成的树,每个点都有一个颜色,非黑即白,现在问对于每个点而言,选出一个连通块,使得白色点的个数与黑色点的个数做差最大 题目分析:记录一下div3的第一次ak ...

  2. CodeForces - 1485E Move and Swap(树形dp)

    题目链接:点击查看 题目大意:给出一棵有根树,每个节点都有权值,满足所有叶子结点到根节点的距离相同,初始时在根节点有两个硬币,分别是红色和蓝色,每次可以执行如下操作: 将红色硬币移动到任意一个子节点 ...

  3. Codeforces 1276D/1259G Tree Elimination (树形DP)

    题目链接 http://codeforces.com/contest/1276/problem/D 题解 我什么DP都不会做,吃枣药丸-- 设\(f_{u,j}\)表示\(u\)子树内,\(j=0\) ...

  4. E. Xenon's Attack on the Gangs,Codeforces Round #614 (Div. 2),树形dp

    E. Xenon's Attack on the Gangs http://codeforces.com/contest/1293/problem/E On another floor of the ...

  5. 【CodeForces - 697D】Puzzles(树形dp,期望dp)

    题目大意: 给定一棵树,从1开始,按DFS的方式访问这棵树  每次从父亲节点随机访问儿子,问每个节点被访问到的时间的期望 输入:第一行一个数n,代表n个节点.第二行n-1个数p2,p3,p4,p5.. ...

  6. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  7. codeforces 816 E. Karen and Supermarket(树形dp)

    题目链接:http://codeforces.com/contest/816/problem/E 题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被 ...

  8. 【Codeforces Round #614(div2)】E-Xenon's Attack on the Gangs(树形dp)

    一.题目链接 https://codeforces.com/contest/1293/problem/E 二.题意 给n个结点,n-1条无向边.即一棵树.我们需要给这n-1条边赋上0~n-2不重复的值 ...

  9. 【Christmas Game】【CodeCraft-21 and Codeforces Round #711 (Div. 2)】【Nim-博弈】【树形DP】【拆分树】

    CodeCraft-21 and Codeforces Round #711 (Div. 2) Christmas Game Nim-博弈 树形DP 拆分树 牛客链接 https://ac.nowco ...

  10. Codeforces - Kay and Snowflake

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

最新文章

  1. Codeforces 833B 题解(DP+线段树)
  2. hdu 1054 Strategic Game 二分图最小点覆盖
  3. Asp.NETCore轻松学系列阅读指引目录
  4. diff and colordiff on Ubuntu
  5. 50 days before NOI2017
  6. Arthas 3.1.2 版本发布 | 增加 logger/heapdump/vmoption 命令
  7. Spring Boot数据校验
  8. 【ModelArts-Lab AI实战营】使用Postman测试Modelarts在线服务(图像分类、物体检测)
  9. 国家邮政局:前10月邮政行业业务收入同比增长17.8%
  10. 浅谈三角带的使用及其分类
  11. 为什么建议使用count(*)来统计数据行数
  12. 金山办公上市,雷军心愿了却!
  13. 华为2022校招新版官网状态码查询方法
  14. Insyde uefi 隐藏设置_利用rufus制作Linux/Windows安装启动盘(支持UEFI+GPT)
  15. 有一行电文,已按以下规律译成密码: A-Z a-z B-Y b-y C-X c-x,即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程将密码译回原文,并
  16. 美女主管送我这个撸码神器!爽翻了......
  17. ​​​​​​​NISP一级考试题库
  18. 如何运用计算机教学教学的收获,计算机教学中行动感悟法的应用
  19. 集合位置(洛谷 P1491)
  20. 安徽信息技术初中会考上机考试模拟_初中会考信息技术考试模拟试题一

热门文章

  1. 替代YY语音,自行搭建语音实时服务器
  2. 用计算机绘制函数图像,用计算机绘制函数图像
  3. python实现GCD算法
  4. 编写可读代码的艺术读书整理
  5. Python的numpy中axis=0、axis=1、axis=2解释
  6. 使用Java的Graphics类进行绘图
  7. 自动售货机软件工程课设_软件工程饮料自动售货机系统-.doc
  8. 数组添加/扩容和数组缩减
  9. 金融数据中心建设模式浅析
  10. linux 查看ip