P4281 [AHOI2008]紧急集合

P4281 [AHOI2008]紧急集合 / 聚会 题解&代码 1 阅读详情

Label

认真手玩各种样例并灵活运用LCA寻找性质

Description

给定一棵nnn个节点、边权均为1的树,q(n,q≤5×105)q(n,q\leq5\times 10^5)q(n,q≤5×105)组询问,每组询问给定三个节点编号x,y,zx,y,zx,y,z,要求在树上寻找一点ppp,使得dis(p,x)+dis(p,y)+dis(p,z)dis(p,x)+dis(p,y)+dis(p,z)dis(p,x)+dis(p,y)+dis(p,z)最小化。每组询问输出ppp及min{dis(p,x)+dis(p,y)+dis(p,z)}min\{dis(p,x)+dis(p,y)+dis(p,z)\}min{dis(p,x)+dis(p,y)+dis(p,z)}。

Solution

首先不难发现:对于x,y,zx,y,zx,y,z,答案一定在任意两点间的最短路径上。而涉及到树上最短路径的问题,往往要考虑LCA。对于此题,如果只是求一组或两组x,y,zx,y,zx,y,z之间的LCA,会涉及到十分多的情况特判,绝非正解。

此题倍增LCA版的正解涉及到一个引理:树上任意三点两两求LCA得到三个节点编号的可重集L={l1,l2,l3}L=\{l1,l2,l3\}L={l1,l2,l3},其中至少有两个节点相同。而对于此题,集合处ppp一定是LLL两个元素中的一个且一定是出现次数为111的节点(事实上,不重合的公共点情况下 一个单独的点移动比另两个点移动距离要多,较另外一种情况花费当然更低)。

最后注意:找到ppp点后我们需要利用树上差分的点对距离版本来写答案式:

对于边权为1的树上任意两点x,yx,yx,y,其最短距离dis(x,y)dis(x,y)dis(x,y)的距离公式为:

​ dis(x,y)=depthx+depthy−2depthlca(x,y)dis(x,y)=depth_x+depth_y-2depth_{lca(x,y)}dis(x,y)=depthx​+depthy​−2depthlca(x,y)​

Code

#include<cstdio>
#include<iostream>
#define ri register int
using namespace std;

const int MAXN=5e5+20;
int N,M,Q,u[MAXN<<1],v[MAXN<<1],fst[MAXN<<1],nxt[MAXN<<1];
int dep[MAXN],f[MAXN][20],s1,s2,s3,l1,l2,l3,pla,ans;

void dfs(int x,int depth,int fa)
{
	dep[x]=depth; f[x][0]=fa;
	for(ri k=1;(1<<k)<=depth;++k)	
		f[x][k]=f[f[x][k-1]][k-1];
	for(ri k=fst[x];k>0;k=nxt[k])
		if(v[k]!=fa)	dfs(v[k],depth+1,x);
}

int LCA(int x,int y)
{
	if(dep[x]>dep[y])	swap(x,y);
	for(ri k=19;k>=0;--k)
		if(dep[y]-(1<<k)>=dep[x])	y=f[y][k];
	if(x==y)	return x;
	for(ri k=19;k>=0;--k)
		if(f[x][k]!=f[y][k])
		{
			x=f[x][k];
			y=f[y][k];
		}
	return f[x][0];
}

int main()
{
	scanf("%d%d",&N,&Q);
	M=(N-1)<<1;
	for(ri i=1;i<=M;i+=2)
	{
		scanf("%d%d",&u[i],&v[i]);
		nxt[i]=fst[u[i]]; fst[u[i]]=i;
		u[i+1]=v[i]; v[i+1]=u[i];
		nxt[i+1]=fst[u[i+1]]; fst[u[i+1]]=i+1;
	}
	dfs(1,0,0);
	for(ri i=1;i<=Q;++i)
	{
		scanf("%d%d%d",&s1,&s2,&s3);
		l1=LCA(s1,s2),l2=LCA(s1,s3),l3=LCA(s2,s3);
		if(l1==l2)	pla=l3;
		if(l1==l3)	pla=l2;
		if(l2==l3)	pla=l1;
		ans=dep[s1]+dep[s2]+dep[s3]-dep[l1]-dep[l2]-dep[l3];
		cout<<pla<<" "<<ans<<'\n';
	}
	return 0;
}
【LCA】P4281 [AHOI2008] 紧急集合 / 聚会|普及+ 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”。在岛上分散有 $n$ 个等待点,有 $n-1$ 条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要花费一个游戏币。 参加游戏的人三人一组,开始的时候,所有人员均任意分散在各个等待点上(每个点同时允许多个人等待),每个人均带有足够多的游戏币(用于支付使用道路的花费)、地图(标明等待点之间道路连接的情况)以及对话机(用于和同组的成员联系)。当集合号吹响后,每组成员之间迅速联系,了解到自己组所有成员所在的 阅读详情

相关推荐

el-transfer和el-tree进行结合搞一个树形穿梭框

由于业务需求需要在穿梭框里使用树形结构,但是本身element里并不支持,于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。

bbkhhvv的博客 6306

P4281 [AHOI2008]紧急集合 / 聚会

P4281 [AHOI2008]紧急集合 / 聚会

weixin_49373560的博客 4113

【SystemVerilog项目实践】4.AHB-SRAMC(验证计划)

验证计划

托马斯的博客 3660

P4281 [AHOI2008]紧急集合 / 聚会 树链剖分

   m个询问 每个询问有三个节点 求出 一个节点 使得这三个节点到该结点的距离之和最小 输出该节点和距离之和 一开始用线段树给三条边均加1 最大值的节点就是答案 但是T了 可以优化log 观察三个节点的lca可发现 如果三个lca都相同 那么就是该节点 如果两个相同一个不同 那么则是那个不同的 不会出现三个lca都不相同的情况 树上距离如...

weixin_30389003的博客 395

手把手教你用示波器搞定PCIe 5.0 REFCLK时钟信号测量(附完整参数解读)

本文详细介绍了如何使用示波器进行PCIe 5.0 REFCLK时钟信号测量,包括示波器与探头的选择、关键参数的测量方法及解读,以及实战中的常见问题与解决方案。通过手把手教学和完整参数解读,帮助硬件工程师高效完成时钟信号测量,确保系统稳定性。

weixin_28704565的博客 359

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1980

P4281 [AHOI2008]紧急集合 / 聚会(LCA做法)

题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”。在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要花费一个游戏币。 参加游戏的人三人一组,开始的时候,所有人员均任意分散在各个等待点上(每个点同时允许多个人等待),每个人均带有足够多的游戏币(用于支付使用道路的花费)、地图(标明等待点之间道路连接的情况)以及对话机(用于和同组的成员联系)。当集合号吹响后,每组成员之间迅速联系,了解到自己组所有成员所在的等待点后

w2319_Willy的博客 1436

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 550

P4281 [AHOI2008] 枚举 + 倍增 LCA

题意 传送门 P4281 [AHOI2008]紧急集合 / 聚会 题解 三人中任意两人 x,yx,yx,y 聚合,路径唯一,即 dist(x,lca(x,y))dist+dist(y,lca(x,y))dist(x,lca(x,y))dist+dist(y,lca(x,y))dist(x,lca(x,y))dist+dist(y,lca(x,y)),则 x,yx,yx,y 走的路径应该覆盖上述路径。使集合花费最小,则应该避免出现多个人走相同路径的情况,即某两个人聚合后,应该保持在原地,等第三个人前来聚合。

neweryyy的博客 156

基于XDMA 的PCIE读写DDR

基于XDMA 的PCIE读写DDR 概述:   想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。 实现功能:PC通过PCIE读写DDR,同时用户通过逻辑代码可以读取被写入DDR内的数据(我是通过VIO实现DDR任意地址,任意数据大小的读取。)。 实践实践!!! 说明: 参考文档: PCI Express Base Specification Revision 3.0 P

Crazzy_M的博客 1万+

利用自己的域名和cloudflare实现邮件转发(无限邮箱注册cursor使用账号) 保姆级图文

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!发现你走远了@mzh原创作品,转载必须标注原文链接欢迎关注『发现你走远了』 专栏,持续更新中欢迎关注『发现你走远了』 专栏,持续更新中『未完待续』

MZH 413

P4281 [AHOI2008] 紧急集合 / 聚会

于是思考如果存在2个lca是一样的就不应该在那边聚集,如果在那边聚集就会有至少2个人要走重复的路。因此如果有2个lca一样就选不一样的,3个一样就lca(x,y,z)树上三个点的路径上找一个点,聚集到一起,经过的边权值和最小。也可以知道2是3,6的lca,就想把每个lca都做一遍。看起来2是最完美的,不会走重复的路线。看样例以为是到比较3个点就可以了。后面发现3个点lca最多就2个。然后能a,就是很复杂的式子。但是都是要枚举3个lca。写完发现询问2错误了。

Lanthamum的博客 458

74.9008深度刷机原理|高通QPST/Firehose底层刷写协议详解

移动设备刷机与底层维修技术指南 本文为移动设备维修人员和高级玩家提供全面的刷机与底层维修技术指南,涵盖高通、联发科和苹果A系列芯片的主要操作。 主要内容 核心操作:Bootloader解锁、Fastboot刷写、EDL深度修复、iTunes DFU模式恢复和分区表重建 适用场景:系统故障修复、底层损坏恢复、安全限制解除、系统降级和深度硬件维修 关键技术:详细解析刷机协议栈层级、关键分区作用和刷机安全机制 操作步骤: 环境搭建与驱动安装 Bootloader解锁(以小米为例) 高通机型系统刷写 苹果设备DFU

2601_95651806的博客 205

【LCA】P4281 [AHOI2008]紧急集合 / 聚会

手推一下样例发现该点去三个LCA中深度最深的那个点。

weixin_62528401的博客 194

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

P4281 [AHOI2008] 紧急集合 / 聚会(内附封面)

LCA真ex

CH_canghan的博客 887

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

P4281 [AHOI2008]紧急集合 / 聚会(LCA)

[AHOI2008]紧急集合 / 聚会 - 洛谷https://www.luogu.com.cn/problem/P4281这题很明显要用LCA写,求3个点两两LCA然后判断,如果这3个LCA相等那么他们就在该点汇合,若有一个不一样则,在那个不一样的汇合,不可能出现三个都不一样的情况。正确性画个图就可以判断出来。...

Ghostttttttiii的博客 353

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LCA结论题 [AHOI2008]紧急集合 / 聚会(洛谷 P4281)

[AHOI2008]紧急集合 / 聚会 题目大意: 给你一颗n个结点的树,然后给你m个3元组(x,y,z);知道到一个点,这个点到x,y,z的距离和最小; 结论:x,y,z两两求lca,会发现有两个lca相等,不相等的那个lca就是最小距离点,根据这个点求最小距离和即可; 代码: #include<bits/stdc++.h> #define LL long long #define...

不知所云的博客 377

洛谷P4281 [AHOI2008]紧急集合 / 聚会 树剖+LCA

洛谷P4281 [AHOI2008]紧急集合 / 聚会 标签 树链剖分 LCA 简明题意 给一棵树,有多组询问,每组询问会给你3个点,让你求树上某一点x,使得x到所给三个点的距离总和最短 思路 容易发现,3个点相互之间的LCA中,取深度最深的那个,就是要集结的点,从这一点出发到三个点的距离之和最短 注意事项 求树上两点u、v的距离时,如果用深度求,需要分类讨论,讨论他们是否...

danzh 305

洛谷P4281【AHOI2008】紧急集合/聚会

题目传送门 这道题目有两个版本的题面(lollollol),不过题目的意思是一样的。 这道题给出了一棵nnn个点的树和mmm个询问,对于每个询问给出三个点,求这棵树上到这三个点距离之和最小的点以及最小距离和。 我们先来考虑一个简化版本:每次不是询问三个点,而是两个。那么答案显而易见:合法的点为这两个点的lcalcalca到这两个点路径上的任意一点,最短距离和也就是这两个点的距离。 好了,那么我们回...

kdlkswb的博客 338

洛谷 P4281 [AHOI2008] 紧急集合 题解

挺好的一道题,本身不难,就把求两个点的LCA变为求三个点两两求LCA,不重合的点才是最优解。值得一提的是,最后对答案的处理运用差分的思想:假设两点 一点深度为d1,另一点 深度为d2,它们LCA深度为d3,这二者之间的距离即为d1+d1-2*d3,只要将这两点推广成三点即可。 1 #include<iostream> 2 #include<cstdio&...

weixin_30301183的博客 221

luogu P4281 [AHOI2008]紧急集合 / 聚会

背景: 发现树剖还有好多题没有做。 题目传送门: https://www.luogu.org/problemnew/show/P4281 题意: 多组询问,在树上找一个点点,使给定的三个点到这个点之间的距离和最小。 思路: ...

zsyz_ZZY的博客 336
上一篇: P2257 YY的GCD
下一篇: HDU4944 FSF’s game
guapi2333
博客等级 码龄9年 7粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值