暂无链接

烯烃

题目背景

银企鹅非常擅长化学。有一天他在试图命名一个巨大的单烯烃分子的时候,想到了一个问题。

题目描述

给你一棵树,一些边有标记,对于每条有标记的边,在树中找到包含这条边的一条最长链,并输出长度。

格式
输入格式

第一行一个整数ididid表示测试点的编号。
多组数据,第二行一个整数TTT表示数据组数。
对于每组数据,第一行两个整数n,mn, mn,m表示节点的个数,和被标记的边的个数。
我们规定111是根,第二行n−1n − 1n−1个整数给出2∼n2 \sim n2∼n 父亲的编号,保证fai&lt;if_{a_i} &lt; ifai​​<i。
第三行mmm个整数范围在[2,n][2, n][2,n]表示哪个点的父边被标记过。

输出格式

对于每组数据输出一行mmm个整数,必须与输入的边顺序一致,给出的
是在这条边必选的情况下树中最长链的长度。

样例
样例输入

0
1
10 3
1 2 3 1 4 6 7 3 8
10 7 9
5

样例输出

8 8 6
另有一个样例,见下发文件。

数据范围
测试点 n≤n ≤n≤ m≤m ≤m≤ T≤T ≤T≤ 特殊约定
1,21, 21,2 100100100 n−1n − 1n−1 100100100
3,43, 43,4 10510^5105 101010 100100100
555 10510^5105 n−1n − 1n−1 100100100 树是一条链
666 10510^5105 n−1n − 1n−1 100100100 所有fai=1f_{a_i} = 1fai​​=1
7,8,9,107, 8, 9, 107,8,9,10 10510^5105 n−1n − 1n−1 100100100
题解

其他大佬dfsdfsdfs一次就出答案了,我却要三次QAQ。

思路如下,包含这条边的最长的链的一端肯定是直径的端点,我们可以以两个端点为根分别dfsdfsdfs一次,dfsdfsdfs时维护深度dep[v]dep[v]dep[v]以及子树中离自己最远的点的距离len[v]len[v]len[v]。那么,对于一个点来说,包含这个点的最长链的长度就是dep[v]+len[v]dep[v]+len[v]dep[v]+len[v]。

注意,这里仅仅是说包含一个点,但题目要求包含一条边,怎么让父亲和儿子被考虑到一起呢?我们注意到,包含点vvv的最长链由两个部分dep[v],len[v]dep[v],len[v]dep[v],len[v]组成,len[v]len[v]len[v]中的点是不确定的,但dep[v]dep[v]dep[v]中一定包含了自己在当前树中的父亲。虽然两棵树的根不一样,但是原树中的父子节点在当前树中依然是父子关系,所以我们就用两个点之中深度较深的点来更新答案即可。

于是我们有了三次dfsdfsdfs:第一次,找到直径的一端;第二次,以该端点为根dfsdfsdfs更新一次答案,并找到另一个端点;第三次,以新找到的端点为根dfsdfsdfs,更新答案。

然后?愉快AC\mathcal{AC}AC?不存在的,不加buffbuffbuff快读快输100100100分变101010分了解一下??

第一个点还有m=0m=0m=0的点,如果你输出了换行,依然会被判错。。。

!&@¥#%!……#&!*#%!@¥#@(内容请读者自行脑补)。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
int head[M],nxt[M<<1],to[M<<1],ask[M],dep[M],len[M],dad[M],ans[M],T,cnt,n,m,le,ri,r;
char c;
inline char nc()
{static const int buflen=1e6;static char buf[buflen],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,buflen,stdin),p1==p2)?EOF:*p1++;
}
int read(){for(r=0;!isdigit(c);c=nc());for(;isdigit(c);c=nc())r=(r<<1)+(r<<3)+c-'0';return r;}
void out(int x){if(x>9)out(x/10);putchar(x%10+'0');}
void add(int f,int t){nxt[++cnt]=head[f],head[f]=cnt,to[cnt]=t;}
void dfs(int f,int v,int d){dep[v]=d;for(int i=head[v];i;i=nxt[i])if(to[i]!=f)dfs(v,to[i],d+1),len[v]=max(len[v],len[to[i]]+1);}
void reset(){memset(head,cnt=le=ri=0,sizeof(head));memset(ans,0,sizeof(ans));}
void in()
{n=read(),m=read();for(int i=2,a;i<=n;++i)a=read(),dad[i]=a,add(a,i),add(i,a);for(int i=1;i<=m;++i)ask[i]=read();
}
void ac()
{if(!m)return;memset(len,0,sizeof(len));dfs(0,1,1);for(int i=1;i<=n;++i)if(dep[i]>dep[le])le=i;memset(len,0,sizeof(len));dfs(0,le,0);for(int i=1;i<=n;++i){ans[i]=dep[i]>dep[dad[i]]?dep[i]+len[i]:dep[dad[i]]+len[dad[i]];if(dep[i]>dep[ri])ri=i;}memset(len,0,sizeof(len));dfs(0,ri,0);for(int i=1;i<=n;++i)ans[i]=max((dep[i]>dep[dad[i]]?dep[i]+len[i]:dep[dad[i]]+len[dad[i]]),ans[i]);for(int i=1;i<=m;++i)out(ans[ask[i]]),putchar(' ');putchar(10);
}
int main(){for(scanf("%*d%d",&T);T--;)reset(),in(),ac();}

[2018.10.10 T2] 烯烃相关推荐

  1. 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H)

    目录 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛链接 竞赛题目 总结 北京化工大学2018年10月程序设计竞赛部分题解(A,C,E,H) 竞赛事件相关 竞赛 ...

  2. 计算机网络部分(共44题),2018年10月自考04741计算机网络原理试卷及答案

    2018年10月高等教育自学考试全国统一命题考试 计算机网络原理 试卷 (课程代码04741) 本试卷共5页,满分l00分,考试时间l50分钟. 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答 ...

  3. 十月 android版本分布,安兔兔发布2018年10月份Android手机性能排行榜

    汽车行业有金九银十一说,手机行业同样也是如此.在刚刚过去的 10 月份,我们见证了多款国产旗舰手机的发布,包括Mate20 系列.小米MIX3.荣耀Mgaic 2.努比亚X等等,得益于强大的硬件配置, ...

  4. windows变量延迟_Windows 10的2018年10月更新可能推迟到11月(这就是原因)

    windows变量延迟 Microsoft stopped offering Windows 10's October 2018 Update on October 6, as it was dele ...

  5. ssl初一组周六模拟赛【2018.3.10】

    前言 先说一下成绩(因某人要求去掉了某人): 姓名 成绩 xjq 280 wyc 200(本人) lrz 200 zyc 100 hjq 40 lw 30 hzb 0 正题 题目1:Clocest ( ...

  6. 2018年10月17日普级B组【模拟赛】

    2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛 第一题--ISBN号码第一题--ISBN号码第一题--ISBN号码 博客链接: https ...

  7. 暑期训练日志----2018.8.10

    训练第12天. 上午光跑厕所了,没A几个题...下午晚上还可以... 这两天A的这几个题基本不用动脑子,看懂题了基本直接套模板就能出... 还有暴力枚举大法好... 2018.8.10

  8. android 跑分,2018年10月国内Android手机安兔兔跑分性能排行榜

    汽车行业有金九银十一说,手机行业同样也是如此.在刚刚过去的10月份,我们见证了多款国产旗舰手机的发布,包括Mate 20系列.小米MIX3.荣耀Mgaic 2.努比亚X等等,得益于强大的硬件配置,这些 ...

  9. 计算机网络原理201810自考,2018年10月自考04741计算机网络原理试卷及答案

    2018年10月高等教育自学考试全国统一命题考试 计算机网络原理试卷 (课程代码04741) 本试卷共5页,满分l00分,考试时间l50分钟. 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答. ...

  10. 如何更新微软的html,如何升级微软2018 Windows 10更新四月正式版17134系统?

    微软已经正式发布了2018 Windows 10更新四月版系统,版本号是Build 17134,目前微软提供了多种升级途径,那么,如何升级微软2018 Windows 10更新四月正式版17134系统 ...

最新文章

  1. 下载最新Android代码的方法
  2. iOS 11 安全区域适配总结
  3. 【转载】 java根据ip地址获取详细地域信息
  4. F - Monkey Banana Problem
  5. 如何理解 Web API
  6. MapReduce实现join操作
  7. 云计算机教室怎么布线,云和县实验小学计算机教室综合布线及计算机安装预算方案.doc...
  8. jbod ugood 磁盘驱动状态_如何检查Mac磁盘空间,mac磁盘空间其他怎么清理
  9. Java io流---拷贝目录
  10. zz乱码、编码问题详
  11. ubuntu 16卸载mysql_ubuntu16.04 彻底卸载MySQL
  12. linux中文件打包压缩,linux在文件打包和压缩
  13. iOS UISegmentedControl
  14. 初试SpringStateMachine框架实现状态机
  15. Python3入门机器学习经典算法与应用 第3章 matplotlib基础
  16. 吉林大学超星学习通05
  17. Unity手游性能优化的经验总结
  18. 60个超实用的网络技能学习平台
  19. odoo14调用akshare库报错:Fatal process out of memory: Failed to reserve memory for new V8 Isolate
  20. linux 内网网络波动检测,Linux内网测试环境模拟网络丢包和延时

热门文章

  1. HashMap源码分析(保姆式注解):三大方法(构造、Put、Remove) ;附带面试考点及博主免费答疑
  2. mac储存文件应该放在哪里_单位不能存档,个人档案应该放在哪里呢,影响今后退休金吗?...
  3. 求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4]
  4. 从零开始学算法 - 快速排序
  5. Mysql事务,并发问题,锁机制
  6. 转载:EM算法的最精辟讲解
  7. LVS-三种负载均衡方式比较
  8. CSS和JS标签style属性对照表
  9. 解决Access to Message Queuing system is denied.权限问题
  10. oracle中怎么建立日志表,怎么在Oracle中创建一个错误日志表