P6584 重拳出击
写在前面
来给 zrm 大佬的题写一篇题解。
这题代码实现难度不高,但是比较锻炼思维,而且应该有不少种解法。着实是一道质量很高的题目。
算法思路
首先呢,显然当小 Z 向当前节点的一棵子树走去时,这棵子树上的 youyou 会与小 Z 的距离减 \(2\) 或者减 \(1\)(减 \(1\) 当且仅当小 Z 的射程与 youyou 的距离为 \(1\))。而其余节点上的 youyou 与小 Z 的相对距离不会发生变化。
其次,小 Z 在一棵子树上花的所有时间,只和这棵子树上最深的有 youyou 的节点有关。
所以,小 Z 只需要去迎上离出发点最深的 youyou,然后在消灭这只 youyou 后再去迎离当前节点最深的 youyou,其余的 youyou 一定能在这个过程中被全部消灭。
用类似于求树的直径的方法,通过 dfs 找到最深 youyou 的深度、最远的两只 youyou 的距离,那么消灭第一只 youyou 后,这时最深的 youyou 深度就是最远距离 \(-\) 第一只 youyou 的深度。
时间复杂度 \(\Theta(n)\)。
Tips
算出两次需要移动的距离来之后直接让距离减去射程 \(k\) 可以让思考简单一些。(下文的距离指减去射程后的距离)
处理好两次移动距离的奇偶性。如果是奇数,距离为 \(1\) 后直接原地等一回合就好,这样答案不会变劣。并且将次远的 youyou 的距离减 \(1\)。
注意特判一下一回合就能消灭全部 youyou 的情况和次远的 youyou 在射程范围内的情况。
注意一回合是先射击在移动,因此消灭最后的 youyou 的回合是一个额外的回合。
Code
#include<bits/stdc++.h>
using namespace std;
const int Maxn = 4e5 + 5;
int n, m, x, y, k, T, ans;
struct e {
int to, next;
} b[Maxn << 1];
int head[Maxn], cnt;
bool vis[Maxn];
bool yy[Maxn];
int dep1st, id1st, dep2nd, id2nd;
int Maxdep, Maxid;
void add(int u, int v)
{
cnt++;
b[cnt].next = head[u];
b[cnt].to = v;
head[u] = cnt;
}
inline int read()
{
int f = 1, w = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0');
return f * w;
}
void dfs(int t, int dep)
{
if(vis[t]) return;
vis[t] = 1;
if((dep > Maxdep) && yy[t])
{
Maxdep = dep;
Maxid = t;
}
for(int i = head[t]; i; i = b[i].next)
{
int tto = b[i].to;
if(vis[tto]) continue;
dfs(tto, dep + 1);
}
}
int main()
{
n = read() - 1;
while(n--)
{
x = read(); y = read();
add(x, y); add(y, x);
}
m = read();
while(m--)
{
x = read();
yy[x] = 1;
}
k = read(); T = read();
dfs(T, 0);
dep1st = Maxdep; id1st = Maxid;
memset(vis, 0, sizeof(vis));
Maxdep = 0; Maxid = 0;
dfs(id1st, 0);
dep2nd = Maxdep - dep1st; id2nd = Maxid;
dep1st -= k; dep2nd -= k;
if((dep1st) <= 0 && (dep2nd <= 0))
{
printf("%d", 1);
}
else if((dep2nd <= 0))
{
printf("%d", (dep1st/2) + (int)(dep1st & 1) + 1);
}
else
{
if(dep1st & 1)
{
dep2nd--;
ans++;
}
printf("%d", ans + (dep1st/2) + (dep2nd/2) + (int)(dep2nd & 1) + 1);
}
return 0;
}
P6584 重拳出击的更多相关文章
- 3D立体显示大屏幕拼接视频墙系统解决方案【转】
http://shop.souvr.com/thread-123416-1-1.html 随着3D立体视像.全息影像等技术不断取得突破性进展,国内外越来越多的公司投身3D显示领域,产品层出不穷.3D技 ...
- J2EE学习中一些值得研究的开源项(转)
这篇文章写在我研究J2SE.J2EE近三年后.前3年我研究了J2SE的Swing.Applet.Net.RMI.Collections. IO.JNI……研究了J2EE的JDBC.Sevlet.JSP ...
- chinacloud大数据新闻
2015年大数据发展八大趋势 (0 篇回复) “数据很丰满,信息很骨感”:Sight Machine想用大数据的方法,打碎两者间的屏障 (0 篇回复) 百度携大数据"圈地" ...
- J2EE开源项目
这篇文章写在我研究J2SE.J2EE近三年后.前3年我研究了J2SE的Swing.Applet.Net.RMI.Collections.IO.JNI……研究了J2EE的JDBC.Sevlet.JSP. ...
- connectVisualVMtoTomcat
connectVisualVMtoTomcat 抱ラ花瘠 荬捻怵 鞅讣囚 骝珈 名诡氩 祉逦戳阜 骚须ⅳ 破竹的从骑士的肩甲出切了下去嚓 闼原 奇荛糠 社獭池 杨叔你养的这些望月螓 ...
- Windows PowerShell漫谈-win7下没有超级终端
Windows PowerShell是我在研究win7新特性的时候发现的新工具,起初没有对它产生太大的兴趣,只是简单看看了有关它的介绍.简单使用了一下,感觉上它和cmd.exe没有本质区别.对它产生兴 ...
- 【阿里聚安全·安全周刊】 全美警局已普遍拥有破解 iPhone 的能力 | 女黑客破解任天堂Switch,称硬件漏洞无法修复
本周的七个关键词: 破解 iPhone丨 女黑客破解任天堂丨假的身份证 丨 扫黄打非丨华盛顿特区发现手机间谍设备 丨 Telegram被俄罗斯监管机构告上法庭丨价值5万美金的Firefox浏览器漏洞 ...
- Xsolla和Hi-Rez工作室联手推行SMITE
视频游戏店面管理和计费解决方式的领导者,Xsolla.将重拳出击将与Hi-Rez游戏工作室合作.该工作室是一家美国的独立游戏开发商,主要开发MOBA游戏-SMITE. 支持全球600多种支付方式 Xs ...
- 《浅入浅出》-RocketMQ
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点脑图.个人联系方式和技术交流群,欢迎Star和指 ...
随机推荐
- [LeetCode]80. Remove Duplicates from Sorted Array II删除数组中的重复值
和第一题不同的地方是,容忍两次重复 虽然题目上说只需要长度,但是否检测的时候如果数组不跟着改变也是不行的 没说清楚题意 自己是用双指针做的,看了大神的答案更简单 public int removeDu ...
- [LeetCode]662. Maximum Width of Binary Tree判断树的宽度
public int widthOfBinaryTree(TreeNode root) { /* 层序遍历+记录完全二叉树的坐标,左孩子2*i,右孩子2*i+1 而且要有两个变量,一个记录本层节点数, ...
- 记一次MAVEN依赖事故
笔者昨天遇到的背景是这样的 MAVEN A模块有一个子模块 需要依赖B模块下的一个子模块 我在B项目内通过mvn deploy上传子模块 但之后在A模块引用 怎么引用都不行 提示 org.a ...
- kafka-spark偏移量提交至redis kafka1.0版本
kafka版本 1.0.0 spark版本 spark-streaming-kafka-0-10_2.11/** * @created by imp ON 2019/12/21 */class Kaf ...
- 使用Python实现的4种快速排序算法
快速排序算法,总体来说就是选一个基准值,把小于基准值的分一拨,把大于基准值的分到另一拨,然后递归. 有区别的是,分区算法有差异,最直接的是,选个基准值,定义两个列表(小值分区less和大值分区grea ...
- Wi-Fi 6 与 5G 相比哪个更快?
随着 iPhone12 的发布,iOS 系统正式开始拥抱 5G,智能手机全面进入了 5G 时代.伴随着各大运营商的 5G 推广以及相关基站建设的如火如荼,5G 成了大家广泛讨论的热门词汇.这样热门的光 ...
- 【Flutter】功能型组件之颜色和主题
前言 Color类中颜色以一个int值保存,显示器颜色是由红.绿.蓝三基色组成,每种颜色占8比特,存储结构如下: Bit(位) 颜色 0-7 蓝色 8-15 绿色 16-23 红色 24-31 Alp ...
- MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见
简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败.在MySQL中,事务至此是在引擎层实现的,但并不是所有的MySQL引擎都支持事务,这也是MyISAM被InnoDB取代的原因之一. ...
- kubernetes环境部署单节点redis
kubernetes部署redis数据库(单节点) redis简介 Redis 是我们常用的非关系型数据库,在项目开发.测试.部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存.这里介绍 ...
- [GKCTF2020]老八小超市儿
题目来自buu 一.题目初探 首先是一个shopxo搭建的演示站,通过扫描后台得到如下的网页 二.题目解答 首先是找到后台登陆的admin.php,然后通过百度找到shopxo的默认管理员登陆账号和密 ...