题目链接:传送门

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

     所含有的点的个数<=原x及x子树的点之和的1/2。输出这个点。

题目思路:比赛时想了一种方法,递归求每个点的连通度然后找子树所含点中最大的联通度向上不断更新,不过方法错了,比如给一条链的话,询问树根1,答案就错了

     后来补题的时候始终是在考虑怎么样将子树中删去一个点能产生最大连通块所含点数保存并更新上去,在这就卡住了。看了这篇博客后,恍然大悟,实际上

     递归到叶子节点,那么对于所有叶子节点的答案就是它本身,既然边界情况已出,我们只需要向上更新即可。(真正的标签是 树形DP)

     在这之前还有一个结论: 对于任一点x,答案一定是在它和它的子树当中。

     我们从x向下递归最后会得到一个包含点数最多的一个联通分块,并且同时得到x与此联通分块直接相连的一个子节点,既然是递归,

     那么再向上传递联通分块所包含点数的同时,答案也同时向上传递,那么这时x的答案是子节点的答案(有可能答案对于x不合法),如果答案不合法,利用

     上面的结论,找答案节点的父节点即可,直到满足条件为止。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 300005
#define maxn 1005
typedef pair<int,int> PII;
typedef long long LL;int n,m,k,x,num,y;
int pre[N],ans[N],Size[N];
struct Node{int to,next;
}node[N<<1];int hcnt,head[N];inline void add(int x,int y){node[hcnt].to=y;node[hcnt].next=head[x];head[x]=hcnt++;
}
void dfs(int x,int fa){int t=x;     ///t表示所含点数最多的连通分量与x直接相连的点Size[x]=1;   ///Size表示当前节点一共包含多少点数int mx=0;    for(int i=head[x];~i;i=node[i].next){int e=node[i].to;if(e==fa)continue;dfs(e,x);Size[x]+=Size[e];if(Size[e]>mx){mx=Size[e];t=e;}}ans[x]=t==x?x:ans[t];while(ans[x]!=x&&Size[x]-Size[ans[x]]>Size[x]/2){ans[x]=pre[ans[x]];}
}
int main(){int i,j,group,v;scanf("%d%d",&n,&m);mst(head,-1);for(i=2;i<=n;++i){scanf("%d",&x);add(i,x);add(x,i);pre[i]=x;}dfs(1,-1);while(m--){scanf("%d",&x);printf("%d\n",ans[x]);}return 0;
}

转载于:https://www.cnblogs.com/Kurokey/p/5615212.html

Codeforces Round #359 (Div. 2) D. Kay and Snowflake相关推荐

  1. Codeforces Round #359 (Div. 2) C. Robbers' watch 搜索

    题目链接:http://codeforces.com/contest/686/problem/C 题目大意: 给你两个十进制的数n和m,选一个范围在[0,n)的整数a,选一个范围在[0,m)的整数b, ...

  2. Codeforces Round #359 (Div. 2) C. Robbers' watch 暴力枚举

    题目链接 题意是真的烦,到最后才知道是n个m其实就是限定表的两个时区的位数,所以所当数不够填满时区的时候前边自动补零 思路:首先来说不能有重复的数字的话,小时和分钟的总位数大于7肯定不行. 7的7次方 ...

  3. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  4. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  5. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  6. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  7. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  8. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  9. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

最新文章

  1. Realm数据库拾遗
  2. gan只用来生成是浪费
  3. Docker 容器技术 — 软件架构
  4. linux 查看用户信息
  5. 成功解决AttributeError: module 'tensorflow.nn.rnn_cell' has no attribute 'linear'
  6. zcmu-1644 多连块拼图
  7. node入门-学习笔记
  8. mysql 的 sql_mode.only_full_group_by属性解析
  9. 图像处理库Pillow
  10. perf-应用程序的调优与使用
  11. Java开源项目Hibernate获得成功的十大理由
  12. idea 项目启动报错:Missing artifact com.oracle:ojdbc7:jar:12.1.0.1的处理方式
  13. matlab节约里程法_MATLAB语言基础-中国大学mooc-试题题目及答案
  14. 申请被拒模板 (三)
  15. R语言绘图—主题选择
  16. Win10系统将“用户”文件夹下用户名文件夹修改自定义名称
  17. CRM一站式管理,助力健身会所C位出道!
  18. spring java 发送邮箱验证
  19. Flume+Kafka双剑合璧玩转大数据平台日志采集
  20. Simulink/Carsim联合仿真,基于pid,mpc自适应巡航控制,定速巡航,紧急避撞等

热门文章

  1. yum 安装mariadb
  2. Mac os下安装brew
  3. .NET(C#):浅谈程序集清单资源和RESX资源
  4. 单例(Singleton)模式
  5. C#获取当前路径的方法集合
  6. 【鬼网络】之PXE高效批量网络装机
  7. docker容器化python开发环境_如何 Docker 化 Python Django 应用程序
  8. P2055 [ZJOI2009]假期的宿舍(二分图匹配)
  9. 1874: 生活大爆炸版石头剪刀布
  10. 库存管理系统软件测试,药房库存管理系统模块测试用例