The Flee Plan of Groundhog

题目描述

样例

input:
7 2
1 2
2 5
5 7
5 6
3 6
3 4
output:
1

题目大意

土拨鼠和OrangeOrangeOrange同住在一棵树上。现在,土拨鼠去看望OrangeOrangeOrange,他从1号结点出发,OrangeOrangeOrange住在nnn号结点。土拨鼠速度为1m/s1m/s1m/s,ttt秒之后,OrangeOrangeOrange发现自己发烧了,为了传染给土拨鼠,他以2m/s2m/s2m/s的速度追赶以1m/s1m/s1m/s速度逃跑的土拨鼠。
现在给定n,tn,tn,t和树,要求土拨鼠从走向OrangetOrange\,tOranget秒之后,他有多少时间可以存活。

分析

第一步肯定是找到土拨鼠ttt秒之后的位置,这个很简单,求个深度和每个节点的父节点然后从nnn开始向上跳即可。
接下来就是比较麻烦的求最长的那条路径。
我们第一想到的就是以现在土拨鼠的位置为根,除了nnn那条链以外的链求最长的即可,你当然不会迎着OrangeOrangeOrange走过去。但是很快就发现十分的不对。
不如我们看下面这种情况:

如果土拨鼠当前的位置在2,那么显然依照上面的策略,土拨鼠会在1号结点等死。但是还有个更优的策略就是向着OrangeOrangeOrange走一步,然后拐到456745674567那条链上可以存活更久。

那么这个应该怎么搞呢??
我们不妨把OrangeOrangeOrange和土拨鼠到达每个节点的时间都标出来:
蓝色是土拨鼠,橙色是OrangeOrangeOrange。

相应地,土拨鼠肯定是不能到达橙色小于等于蓝色的点的因为这样,OrangeOrangeOrange就可以直接抓住他了。因此对于每条链,一旦找到一个不合法的点,那么这个点的父节点就是土拨鼠向这条链能走的最远的路,ansansans只要取这个点OrangeOrangeOrange所需要的时间就可以了。
那么如果整条链都是合法的,显然,取叶节点就可以了。
所以,3个dfsdfsdfs爆搜,出答案。
暴力出奇迹

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1e5+100;
vector<int> vec[MAXN];//存边
int dep[MAXN],fa[MAXN],cs,blk[MAXN];
//blk Orange的时间 fa 父节点 dep 两个用处,见下面注释
int n,t,ans;
void dfs(int x,int depth,int fx)
{dep[x]=depth;for(int i=0;i<vec[x].size();i++){int s=vec[x][i];if(s==fx) continue;fa[s]=x;dfs(s,depth+1,x);}
}//预处理的dfs,先求出以1为根的向n的dep,然后方能求ts后现在的位置
//后面的用处是找土拨鼠的时间,存在dep里
void dfs1(int x,int depth,int fx)
{blk[x]=depth/2;for(int i=0;i<vec[x].size();i++){int s=vec[x][i];if(s==fx) continue;dfs1(s,depth+1,x);}
}//找Orange的时间,存在blk里
void getans(int x,int fx)
{bool fl=0;for(int i=0;i<vec[x].size();i++){int s=vec[x][i];            if(s==fx) continue;fl=1;if(dep[s]>=blk[s]){//不合法的点ans=max(blk[x],ans);continue;}getans(s,x);}if(!fl){ans=max(ans,blk[x]);}//叶节点
}//然后以当前位置为根,找到每条链能走的最远的地方
int main()
{int x,y;scanf("%d%d",&n,&t);for(int i=1;i<n;i++){scanf("%d%d",&x,&y);vec[x].push_back(y);vec[y].push_back(x);}dfs(1,0,-1);int gol=dep[n]-t,rt;//gol 走完ts后与n的距离 rt 根if(gol<=0){puts("0");return 0;}//如果ts后已经到了,那么Orange就直接抓住了土拨鼠for(int i=n,j=gol+1;j;i=fa[i],j--) rt=i;//找出t秒之后当前的位置,rtmemset(dep,0,sizeof(dep));memset(blk,0,sizeof(blk));dfs(rt,0,-1);//得出土拨鼠的时间dfs1(n,1,-1);//得出Orange的时间ans=-1;getans(rt,-1);//得出答案printf("%d\n",ans);
}

END

这题可以只用一个dfs,然后思路差不多,只不过把时间换成是这个节点到两人的距离,用lcalcalca就可以过。其实没有什么本质的差别,但是我的做法还是被DNdalaoDNdalaoDNdalao嫌弃了wuwuwu……

2020牛客暑期多校训练营The Flee Plan of Groundhog(树形DP)相关推荐

  1. 2020牛客暑期多校训练营(第九场)E题 Groundhog Chasing Death

    题意 计算 ∏ i = a b ∏ j = c d g c d ( x i , y j ) \prod_{i=a}^{b}\prod_{j=c}^{d}gcd(x^i,y^j) i=a∏b​j=c∏d ...

  2. 2020牛客暑期多校训练营(第九场) Groundhog Chasing Death

    Groundhog Chasing Death 题意:给出a.b.c.d.x.y,让求下列式子. 思路:对于gcd(x,y)我们知道 gcd(x,y)=p1 ^(min(n1,n2)) * p2 ^( ...

  3. 2020牛客暑期多校训练营(第六场)

    2020牛客暑期多校训练营(第六场) 额,睡了一下午,直接错过了比赛... 文章目录 A African Sort 题意: 题解: 代码: B Binary Vector C Combination ...

  4. 2020牛客暑期多校训练营(第四场)

    2020牛客暑期多校训练营(第四场) 这场属实有点难受 文章目录 A Ancient Distance B Basic Gcd Problem 题目 代码: C Count New String D ...

  5. 2020牛客暑期多校训练营(第一场)

    文章目录 A B-Suffix Array B Infinite Tree C Domino D Quadratic Form E Counting Spanning Trees F Infinite ...

  6. 2020牛客暑期多校训练营(第二场)

    2020牛客暑期多校训练营(第二场) 最烦英语题 文章目录 A All with Pairs B Boundary C Cover the Tree D Duration E Exclusive OR ...

  7. 2020牛客暑期多校训练营(第七场)J.Pointer Analysis

    2020牛客暑期多校训练营(第七场)J.Pointer Analysis 题目链接 题目描述 Pointer analysis, which aims to figure out which obje ...

  8. 2020牛客暑期多校训练营(第三场)A.Clam and Fish

    2020牛客暑期多校训练营(第三场)A.Clam and Fish 题目链接 题目描述 There is a fishing game as following: The game contains ...

  9. 2020牛客暑期多校训练营(第五场)——E Bogo Sort

    2020牛客暑期多校训练营(第五场)--E Bogo Sort 题目描述 Today Tonnnny the monkey learned a new algorithm called Bogo So ...

  10. E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解)

    E Groundhog Chasing Death(2020牛客暑期多校训练营(第九场))(思维+费马小定理+质因子分解) 链接:https://ac.nowcoder.com/acm/contest ...

最新文章

  1. AI框架精要:设计思想
  2. JS魔法堂:不完全国际化本地化手册 之 拓展篇
  3. Webshell免杀绕过waf
  4. Go之Beego原生查询QueryRow QueryRows Values ValuesList ValuesFlat RowsToMap RowsToStruct
  5. python输入一个人的名字_怎样用c语言做到输入一个人的名字才会输出一个心?
  6. 杂谈——杭州考驾照历程
  7. YbtOJ#791-子集最值【三维偏序】
  8. 更改oracle背景,Oracle 11gR2修改用户后导致系统HANG住
  9. VC中连接mdb数据库及其数据读取方法
  10. Google回应全球宕机:磁盘满了;摩拜App昨晚正式停止服务;Docker Desktop 3.0.0发布|极客头条...
  11. 华大MCU在IAR下的调试环境搭建及相关补丁包(百度网盘链接)
  12. 利用云计算来实现业务转型呢,有五个步骤可以遵循
  13. 软件工程概述思维导图总结(二)
  14. (30)tensorboard ValueError: Duplicate plugins for name projector
  15. DNC: A deep neural network-based clustering-oriented network embedding algorithm 2021
  16. 修改docker ip网段
  17. ios 配置了代理且使用 chls.pro/ssl 下载不了证书,无法弹出下载证书的提示
  18. 炔烃+叠氮“点击化学”(Click chemistry)试剂,你值得拥有
  19. TextGrabber重大更新,识别文字并实时离线翻译,支持中文
  20. Android 获取指定图片或文件的大小

热门文章

  1. Matlab数值剔除
  2. java生成二维码(底部添加文字+linux安装微软雅黑)
  3. 电力系统潮流计算中的导纳矩阵计算,matlab源程序
  4. ios中Date.prase()兼容问题
  5. 谷歌浏览器打不开产品给的原型图,提示AXURE RP EXTENSION For Chrome
  6. CENTOS6 安装和使用PHP全链路追踪 Molten
  7. 江湖上再也没有摩拜单车了
  8. java架构中:亿级用户中心的设计与实践
  9. php 港澳台、大陆身份证正则表达式
  10. easyexcel自定义拦截器,实现自定义单元格样式