题目链接

题意

有一棵树
A 在点 1,B 在点 2
A的移动速度是每秒走过一条边,B的移动速度是每秒走过两条边(也可以只走一条)
前 t 秒 A 在不断的走向 B,B 不动
之后 B 开始移动,开始追 A,A 开始逃离
求问 A 最晚被追到的时间

分析

首先 A 在 t 秒的时候所在的位置是固定的,因为树上任意两点间路径是唯一的。所以可以把 B 为根,用树上倍增的方式来快速找到 A 的第 t 个祖先,即 A 开始的位置。
接下来 A 和 B 会开始追击,考虑到达每一个点的情况,考虑 A 到达每个点所需要的时间和 B 到达每个点的时间,对于这个点,取这两个时间中的较小者,即为 A 和 B 第一次到达这个点的时间。然后从 A 出发寻找最大的两者到达时间相等的点

AC code

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 100;vector<int> g[N];int anc[N][20];
bool visit[N];void dfs(int u, int fa) {anc[u][0] = fa;for (int i = 1; i <= 19; i++) anc[u][i] = anc[anc[u][i - 1]][i - 1];for (auto &v: g[u])if (v != fa) dfs(v, u);
}int kthFa(int u, int k) {int bit = 0;while (k) {if (k & 1) u = anc[u][bit];k >>= 1;bit++;}return u;
}int mouseTime[N], catTime[N];void solve() {int n, t;cin >> n >> t;for (int i = 0; i < n - 1; ++i) {int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs(n, 0);int kf = kthFa(1, t);if (kf == 0) kf = n;queue<pair<int, int>> q;memset(visit, false, sizeof(bool) * (n + 10));q.push({kf, 0});while (!q.empty()) {auto cur = q.front();q.pop();mouseTime[cur.first] = cur.second;visit[cur.first] = true;for (auto item : g[cur.first]) {if (visit[item]) continue;q.push({item, cur.second + 1});}}memset(visit, false, sizeof(bool) * (n + 10));q.push({n, 0});while (!q.empty()) {auto cur = q.front();q.pop();catTime[cur.first] = cur.second;visit[cur.first] = true;for (auto item : g[cur.first]) {if (visit[item]) continue;q.push({item, cur.second + 1});}}memset(visit, false, sizeof(bool) * (n + 10));q.push({kf, 0});int ans = 0;while (!q.empty()) {auto cur = q.front();q.pop();visit[cur.first] = true;ans = max(ans, max((catTime[cur.first] + 1) / 2, mouseTime[cur.first]));if ((catTime[cur.first] + 1) / 2 <= mouseTime[cur.first]) {continue;}for (auto item : g[cur.first]) {if (visit[item]) continue;q.push({item, 0});}}cout << ans << endl;
}signed main() {ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#ifdef ACM_LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);signed localTestCount = 1, localReadPos = cin.tellg();char localTryReadChar;do {if (localTestCount > 20)throw runtime_error("Check the stdin!!!");auto startClockForDebug = clock();solve();auto endClockForDebug = clock();cout << "Test " << localTestCount << " successful" << endl;cerr << "Test " << localTestCount++ << " Run Time: "<< double(endClockForDebug - startClockForDebug) / CLOCKS_PER_SEC << "s" << endl;cout << "--------------------------------------------------" << endl;} while (localReadPos != cin.tellg() && cin >> localTryReadChar && localTryReadChar != '$' &&cin.putback(localTryReadChar));
#elsesolve();
#endifreturn 0;
}

【2020牛客多校】第九场 K The Flee Plan of Groundhog——BFS相关推荐

  1. 2019牛客多校第九场AThe power of Fibonacci(广义BM)

    2019牛客多校第九场AThe power of Fibonacci(广义BM) 题目大意 求斐波那契数列m次方的前n项和 解题思路 显然,斐波那契的m次方前缀和依然是线性递推,因此考虑用exBM求解 ...

  2. 2020 牛客多校第一场

    2020 牛客多校第一场 A. B-Suffix Array 后缀数组的思想:倍增+桶排序的方式找出一串连续序列后缀的大小.虽说正常使用的时候都是字典序,但是只要修改排序方式,也能够达到一个类似的&q ...

  3. Cutting Bamboos(牛客多校第九场H主席树+二分+思维)

    链接:https://ac.nowcoder.com/acm/contest/889/H 来源:牛客网 There are n bamboos arranged in a line. The i-th ...

  4. Quadratic equation(二次剩余)2019牛客多校第九场

    链接:https://ac.nowcoder.com/acm/contest/889/B 来源:牛客网 题目描述 Amy asks Mr. B problem B. Please help Mr. B ...

  5. [2020牛客多校第一场]Coda的题解集

    被暴打了. 会先写比赛中过题数100+的题目,其他的以后再补. 施工中,未完待续- F Infinite String Comparision 一开始想到的是对比到lcm(|a|,|b|),意料之中T ...

  6. 2019牛客多校第九场 H Cutting Bamboos (二分主席树)

    看到题解说二分 心里也有数了..... H Cutting Bamboos 给了一些高度得柱子 每区间你可以坎y次 y次之后 必须砍没有了 没有砍 总长度得一样 问第x次砍得高度在哪里 因为砍得次数 ...

  7. 2019牛客多校第九场AThe power of Fibonacci——扩展BM

    题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...

  8. 牛客多校第九场 H Cutting Bamboos —— 主席树

    题目链接:点我啊╭(╯^╰)╮ 题目大意: 给你一片竹林,编号 1 1 1 到 n n n ,给定初始高度     每次查询区间,问一共砍 y y y 刀的时候,第 x x x 刀的高度     要求 ...

  9. 2020牛客多校第一场B虚树+质数筛+换根dp

    题目大意: 1.可以发现阶乘增长是很快的所以你要把整颗树建立出来是不实际的. 2.我们可以假设这棵树已经建出来出来了我们应该怎么搞 首先很明显是一个树形dp, 我们设dp[j],是以j为u到其他点距离 ...

  10. python字符串去重及排序 牛客_2018牛客多校第一场 D.Two Graphs

    题意: n个点,m1条边的图E1,n个点,m2条边的图E2.求图E2有多少子图跟图E1同构. 题解: 用STL的全排列函数next_permutation()枚举映射.对于每一种映射枚举每一条边判断合 ...

最新文章

  1. xiaohai.cf index.php,php des 加密 - 北京破小孩
  2. 全球厂商已向自动驾驶投入800亿美元 依然群龙无首 | 厚势
  3. Django REST framework API 指南(2):响应
  4. 代码注释规范-google版本
  5. 盘点selenium phantomJS使用的坑
  6. sql连接远程服务器索引超出了_手机怎么连接服务器远程桌面?RD client远程桌面使用教程...
  7. spring的beanutils工具类_基于spring-beans实现工具类BeanUtils基于Class实例化注入对象及查找方法、复制属性等操作...
  8. 1019. 链表中的下一个更大节点
  9. DHPST云主机分销系统源码
  10. Linux实用代码--文件系统操作
  11. ELF格式解析库之基本数据类型
  12. 大小文件服务器区别,在提供静态包时,观察到Nginx和Express服务器之间文件大小的差异...
  13. 【报告分享】2020直播生态研究报告.pdf(附下载链接)
  14. SpringBoot 实战 (二) | 第一个 SpringBoot 工程详解
  15. 烧写嵌入式linux,嵌入式linux系统烧写
  16. 联想yoga13装win7步骤介绍
  17. 网上书城_前端动态加载类别and书籍显示
  18. Linux系统管理---RAID磁盘阵列
  19. gen-cpp/.deps/ChildService.Plo: No such file or directory
  20. 51单片机电路原理图_(51单片机)课设项目2-超声波测距(SRF04、LCD1602、蜂鸣器报警电路)...

热门文章

  1. Wannacry 勒索病毒有预设的解密口令“WNcry@2ol7”么?
  2. 百度人脸识别之人脸注册AddUser
  3. 教你提取图片中文字的四种方法
  4. 小学一年级20以内加减法题目自动生成(家长的福利,孩子的魔鬼)
  5. html图片按钮按钮点击效果
  6. jQuery实现 手风琴图片切换效果( 超简单)
  7. 日常交通工具日语词汇
  8. linux定时任务生效_linux ( crontab 定时任务命令)
  9. java 获取当前年份 月份,当月第一天和最后一天
  10. 数据预处理和特征工程1--无量纲化:数据归一化、标准化