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

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

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P4281#sub
给出一棵树,每次给出三个点 x , y , z x,y,z x,y,z,求哪一个点与这三个点的距离之和最近。


思路:

首先,很明显的一件事情是:给出一棵树上的三个点,这三个点中总有两个的 L C A LCA LCA是一样的。

证明:
假设我们能找到一个点,这个点的左子树中有2个标记点,右子树中有1个标记点(或者左子树1个,右子树2个),那么很明显左子树中的两个点分别与右子树的点取 L C A LCA LCA的结果是一样的,都是选择的点。
那么如果我们找不到这样的点,那么就只有这三个点在一条链上可能。
那么如果这三个点在一条链上,那么很明显在下面的两个点与在上面的点取 L C A LCA LCA的结果是一样的。都是上面那个点。
证毕。

好吧这个证明并不严谨,但是再仔细想一想就会发现是对的。
所以,答案很明显就出来了。三个 L C A LCA LCA中不同的那个就是最佳位置。


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 500100
#define LG 20
using namespace std;

int n,m,tot,head[N],f[N][LG+1],dep[N],l1,l2,l3;

struct edge
{
	int next,to;
}e[N*2];

int in;
char ch;

int read()  //快读,不加好像会T
{
    in=0;
    while((ch=getchar())<=47||ch>=58);in=(in<<3)+(in<<1)+ch-48;
    while((ch=getchar())>=48&&ch<=57) in=(in<<3)+(in<<1)+ch-48;
    return in;
}


void add(int from,int to)
{
	e[++tot].to=to;
	e[tot].next=head[from];
	head[from]=tot;
}

void dfs(int x,int fa)
{
	dep[x]=dep[fa]+1;
	for (int i=1;i<=LG;i++)
	 f[x][i]=f[f[x][i-1]][i-1];
	for (int i=head[x];~i;i=e[i].next)
	 if (e[i].to!=fa)
	 {
	 	f[e[i].to][0]=x;
	 	dfs(e[i].to,x);
	 }
}

int lca(int x,int y)
{
	if (dep[x]<dep[y]) swap(x,y);
	for (int i=LG;i>=0;i--)
	 if (dep[f[x][i]]>=dep[y]) x=f[x][i];
	if (x==y) return x;
	for (int i=LG;i>=0;i--)
	 if (f[x][i]!=f[y][i])
	 {
	 	x=f[x][i];
	 	y=f[y][i];
	 }
	return f[x][0];
}

int main()
{
	memset(head,-1,sizeof(head));
	n=read();
	m=read();
	int x,y,z;
	for (int i=1;i<n;i++)
	{
		x=read();
		y=read();
		add(x,y);
		add(y,x);
	}
	dep[0]=-1;
	dfs(1,0);
	for (int i=1;i<=m;i++)
	{
		x=read();
		y=read();
		z=read();
		l1=lca(x,y);
		l2=lca(y,z);
		l3=lca(x,z);  //求出组合的LCA
		if (l1==l2) 
		 printf("%d %d\n",l3,dep[x]+dep[y]-dep[l3]*2+dep[z]+dep[l3]-dep[l1]*2);
		else if (l2==l3)
		 printf("%d %d\n",l1,dep[y]+dep[z]-dep[l1]*2+dep[x]+dep[l1]-dep[l2]*2);
		else if (l1==l3)
		 printf("%d %d\n",l2,dep[x]+dep[z]-dep[l2]*2+dep[y]+dep[l2]-dep[l3]*2);
	}
	return 0;
}
LCA (最近公共祖先) Tarjan & 倍增 LCA Tarjan: 实现原理 理解:离线算法,建好树后再查询,一次DFS 吧所有查询解决完。 时间复杂度:O(n+q); n个点 q次询问 补一下:链式向前星,并查集 ,Tarjan 代码 #include #include #include #include #include using namespace std; const int MAXN = 5e5+ 10; int fa[MAXN], head[MAXN], head_ask[MAXN], cnt, cnt_ask, ans[MAXN]; bool vis[MAXN]; int n, m, s; struct Edge{ 立即下载

相关推荐

PCI Express 权威指南:从协议原理到芯片实现

目录 全文总览第一部分:PCIe体系结构概览第1章 互连技术的演进与PCIe的诞生1.1 从ISA到PCI:并行总线的辉煌与瓶颈1.2 PCI-X的尝试与局限1.3 串行革命:从AGP、PCI到PCIe的范式转移1.4 PCIe的核心优势第2章 PCIe系统全局视角2.1 系统拓扑:Root Complex, Switch, Endpoint的职能与关系2.2 拓扑结构实例:服务器、工作站、嵌入式系统2.3 枚举与配置:系统如何发现和组织PCIe设备2.4 地址空间第3章 PCIe协议分层架构3.1 分层模

qq_42882296的博客 2891

LCA详解(洛谷模板题)

一、算法定义  LCA是在线查询树上两点的最近公共祖先的算法,可运用倍增的方法,时间复杂组O(nlogn) 二、算法过程     1.倍增使深度较深的点跳到和深度较浅的点同一深度。     2.两个点一起往上跳,直到找到公共祖先 三、分步代码详解 1.预处理:通过dfs,求出树上每个节点的深度。注:p[x][0]是x的父节点,如果遍历到父节点则跳过,其他的与该点相邻的点都是他的子节点

spencer12138的博客 1701

GR00TN1.7国内本地下载+模型下在+hugingface无法连接,本地模型下载

GR00TN1.7

alsj123456的博客 97

洛谷 P3379 【模板】最近公共祖先(LCA)

摘要: 本文介绍了求解有根树中最近公共祖先(LCA)问题的多种方法,重点讲解了倍增算法的实现。文章首先描述了同步前进法的基本思路,并指出其O(n)时间复杂度在处理大规模数据时会超时。随后详细阐述了基于倍增思想的优化算法,通过预处理fa数组(记录各节点向上走2^j步到达的节点),将时间复杂度降至O(logn)。文中给出了完整的算法实现步骤,包括初始化、深度优先遍历预处理、以及利用lg数组优化查询过程的具体代码。此外还简要提及了其他解法如Tarjan、DFS序和树链剖分等方法,为读者提供了多种解决LCA问题的思

君义NOIP的博客 1079

混合部署 操作系统混合部署

在openEuler Embedded 22.03中,已经集成了OpenAMP相关支持,并与openEuler的SIG Zephyr合作实现了openEuler Embedded与实时操作系统Zephyr在QEMU平台上的混合部署。具体的混合部署方式取决于设备的硬件和软件支持。例如,可以使用虚拟机软件(如VirtualBox)在Linux操作系统上运行Android虚拟机,从而实现Linux和Android的混合部署。需要注意的是,混合部署涉及到设备的硬件和软件兼容性,以及操作系统的配置和管理。

dianqicyuyan的博客 1763

Unreal 5 MetaHuman插件全流程:从安装到角色动画生成

本文详细介绍了Unreal 5中MetaHuman插件的全流程使用指南,从安装配置到角色动画生成。通过Quixel Bridge下载预设角色,利用面部捕捉技术赋予数字人模型生命力,并提供材质编辑、性能优化等进阶技巧,帮助用户快速创建照片级真实的虚拟角色。

weixin_29009081的博客 829

洛谷 P3398 仓鼠找sugar 【思维 + LCA】

传送门 题意: 就是给定一棵树, 然后有q次询问, 每次给出树上的两条路径, 问着两条路径是不是有没有公共点 思路: 通过画一系列的图可知, 如果两条路径有公共点, 那么一定有一条路径的LCA是在另一条路径上的, 那么我们现在如何判断一个点x是不是再一条路径上了?如果点x在路径u-&amp;gt;v上, 那么一定满足dep[x] &amp;gt;= dep[LCA(u, v)], 并且LCA(u, x) == x...

Anxdada -- 我等风来也等你 524

MATLAB创建GUI面板实现二维码生成与识别

利用matlab设计gui界面实现二维码的生成与内容识别

infinitystardust的博客 3148

【题解】洛谷P1351 联合权值(dfs、LCA)

这道题一开始啥也没想就用最短路写,才40分,然后发现自己对寻找最大值取模了,改了之后60分。。然后又发现n个点,n-1条边,其实这个图就是一棵树,每一个点到其余点的最短路有且只有一条,完全可以用dfs对每个点进行扩展,扩展两层找到点然后进行操作。。虽然看起来更简便了,但还是60分,所以我们得想更好的方法。 为啥它让你找距离为2的点而不是距离为3、4……的点呢?我们可以发现,对于一个中心结点,它的...

Rem_Inory的博客 440

音频降采样系数

如果需要把8K, 16K, 32K, 48K采样率的音频数据降为4K的音频数据, 最简单的方法根据降频倍数来取点, 但是线性度不好. 另一种线性度好一点的方法是: 取适当个数的点数, 各点乘以各自点的系数, 然后相加取平均值. 降频倍数与系数的关系如下: 2倍:     {0.3, 0.4, 0.3} 4倍:    {0.15, 0.2, 0.3, 0.2, 0.15} 8倍:   {0

joans123的专栏 4645

基于Simulink的电源纹波抑制仿真

电源纹波(Power Supply Ripple)是指直流电源输出中存在的交流分量。纹波的存在会导致电压波动,进而影响负载设备的性能和寿命。为了确保高质量的电源输出,通常需要设计有效的滤波电路来抑制纹波。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电源纹波抑制方案。本教程将详细介绍如何使用 Simulink 进行电源纹波抑制的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行电源纹波抑制的仿真实例。背景介绍:理解电源纹波及其对电力电子系统的影响。仿真建模过程。

xiaoheshang_123的博客 512

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

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

danzh 305

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

丨汀、的博客 4万+

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...

不知所云的博客 376

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

给一个图,给图上三个点,各自从这三个点出发,到达同一个点,问最少走的花费是多少?(每条边的花费都是1) 思路:两两求 LCA,得到三个 LCA,必定其中两个是重叠的,选择不重叠的那个点作为目的地(可以脑补一下,假如选重叠的那个,一段路是会被两个人走的),然后再用差分。 LCA 可以用倍增来求。 #include<iostream> #include<cstdio> #include<cstring> #define MAXN 500010 #define MAXM 100

wineandchord 223

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

题目 Sample-in 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 2 4 4 6 6 6 Samplee-out 5 2 2 5 4 1 6 0 思路 已知这个图是一颗树,然后要求三个点到某个点的距离总和最少。 两个点的话可以找最近公共祖先,用LCA,即倍增求最近公共祖先。 三个点的情况根据模拟可以得到:至少有 两组的最近公共祖先是相同的,如下图lca(x,z)=lca(y,z)。而最优解是走到x,y的最近公共祖先上,因为这个祖先深度最深,可以牺牲z一

鲤の游 186

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)

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

Jacob0824的博客 592

洛谷P4281 AHOI紧急集合/聚会 (树链剖分 + LCA)

2020.5.23 今天本来信心满满去打code+了,结果从彩蛋题就开始懵逼,后来ide坏了,修好以后T1的做法应该是对的,然而segfault了,可能是边界问题懒得判了。 今天来写一发树剖和lca,这个难度都不大,基本都知道该怎么做,然而这道题要求3节点的lca,然后我写完就又懵了,这怎么搞?一次lca大概是log的,但是我起初是用a和b的lca去搞c的lca,然而发现答案错了。自闭了,去查题解发现,这题的关键在于a,b,c三个点的lca有3个,其中两个必定相同,所以直接就用那个不同的就行了,然后根据de

Stagflation的博客 415

洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树链剖分,最近公共祖先LCA)

树链剖分,最近公共祖先LCA

qq_38232157的博客 176

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

如果有两个点,那么最短的位置一定是两点中的 lca,此时有三个点,我们观察 6 3 1 这组询问,如上图所示: 最后的答案为 2,也就是 3 6 的 lca,不妨可以猜测,最后的位置一定是在某两点的 lca 处,所以枚举即可 代码并没有采用倍增,而是采用树剖来处理 lca const int N=5e5+5; int n,m; int i,j,k; int a[N]; vector<int> G[N]; int dep[N],fa...

C_Dreamy的博客 488

洛谷· [AHOI2008]紧急集合 / 聚会

初见安~这里是传送门:洛谷P4281紧急集合/聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”。在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要花费一个游戏币。 参加游戏的人三人一组,开始的时候,所有人员均任意分散在各个等待点上(每个点同时允许多个人等待),每个人均带有足够多的游戏币(...

樱狸✨愿携清风归来处 467

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

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

weixin_62528401的博客 194

信息学奥赛一本通 1558:聚会 | 洛谷 P4281 [AHOI2008] 紧急集合 / 聚会

本文研究了在树结构中选择最优聚会地点的问题。通过分析三个节点的最近公共祖先(LCA)性质,证明了最优解必定出现在三个两两LCA中不同的那个节点。给出了两种求解方法:一是直接计算三个节点到选定LCA的距离之和,二是利用两两节点间距离公式间接求解。具体实现采用倍增算法高效计算LCA,时间复杂度为O(n log n)。该算法有效解决了在树网中寻找最小化总路径成本的聚会点问题,适用于大规模数据场景。

君义NOIP的博客 1105

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

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

Ghostttttttiii的博客 353

洛谷P4281 紧急集合 / 聚会

LCA 题目要求找离三个点最近的点,我们先看两个点的情况,自然是找LCA,那么三个点的时候是否与LCA有关呢? 显然,离三个点最近的点一定是在这三个点联通的简单路径上。 可以简单证明一下,假设某个点离a,b,c三个点最近且不在联通这三个点的简单路径上,那么有a,b,c中有两个点一定会经过某个点才能来到该点,换句话说,就是有两个人都要多走一段距离,那为什么不把两个人多走的距离换成让另外一个人走呢?这...

weixin_34190136的博客 125
上一篇: 【洛谷P2420】让我们异或吧【DFS】
下一篇: 【洛谷P2622】关灯问题II【BFS】【状压】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值