[AHOI2008] 紧急集合 / 聚会

[AHOI2008] 紧急集合 / 聚会

题目描述

欢乐岛上有个非常好玩的游戏,叫做“紧急集合”。在岛上分散有 n n n 个等待点,有 n − 1 n-1 n1 条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要花费一个游戏币。

参加游戏的人三人一组,开始的时候,所有人员均任意分散在各个等待点上(每个点同时允许多个人等待),每个人均带有足够多的游戏币(用于支付使用道路的花费)、地图(标明等待点之间道路连接的情况)以及对话机(用于和同组的成员联系)。当集合号吹响后,每组成员之间迅速联系,了解到自己组所有成员所在的等待点后,迅速在 n n n 个等待点中确定一个集结点,组内所有成员将在该集合点集合,集合所用花费最少的组将是游戏的赢家。

小可可和他的朋友邀请你一起参加这个游戏,由你来选择集合点,聪明的你能够完成这个任务,帮助小可可赢得游戏吗?

输入格式

第一行两个正整数 n n n m m m,分别表示等待点的个数(等待点也从 1 1 1 n n n 进行编号)和获奖所需要完成集合的次数。

随后 n − 1 n-1 n1 行,每行两个正整数 a , b a,b a,b,表示编号为 a a a 和编号为 b b b 的等待点之间有一条路。

随后 m m m 行,每行用三个正整数 x , y , z x,y,z x,y,z,表示某次集合前小可可、小可可的朋友以及你所在等待点的编号。

输出格式

输出共 m m m 行,每行两个用空格隔开的整数 p , c p,c p,c。其中第 i i i 行表示第 i i i 次集合点选择在编号为 p p p 的等待点,集合总共的花费是 c c c 个游戏币。

样例 #1

样例输入 #1

6 4  
1 2  
2 3  
2 4 
4 5
5 6
4 5 6
6 3 1
2 4 4 
6 6 6

样例输出 #1

5 2
2 5
4 1
6 0

提示

对于 40 % 40\% 40% 的数据, n ≤ 2 × 1 0 3 n\leq2\times10^3 n2×103 m ≤ 2 × 1 0 3 m\leq2\times 10^3 m2×103

对于 100 % 100\% 100% 的数据, 1 ≤ x , y , z ≤ n ≤ 5 × 1 0 5 1\leq x,y,z\leq n\leq 5\times10^5 1x,y,zn5×105 1 ≤ m ≤ 5 × 1 0 5 1\leq m\leq 5\times 10^5 1m5×105

分析

LCA与树的分析,由于题目中已经保证了是树,而有三个标记点,每次求任意两个的LCA,而必定有两个相同,即可得到一个最近的LCA,在建树时求出深度,用O(1)求出最近点的距离

代码

#include <bits/stdc++.h>
using namespace std;
const int M=6*1e5;
vector<int > T[M];
int n,m,s;
struct LCA{
	static const int k=25;
	int f[M][k+1],d[M],dmax=0;
	void init(int s){
		f[s][0]=s;
		for(int i=1;(1<<i)<=dmax;i++)
			for(int j=1;j<=n;j++)
				f[j][i]=f[f[j][i-1]][i-1];
		return;
	}
	int query(int x,int y){
		if(d[x]>d[y]) swap(x,y);
		for(int i=k;i>=0;i--) if(d[f[y][i]]>=d[x]) y=f[y][i];
		if(x==y) return x;
		for(int i=k;i>=0;i--){
			if(f[x][i]!=f[y][i])
				x=f[x][i],y=f[y][i];
		}
		return f[x][0];
	}
	void dfs(int u,int fa,int dep){
		if(d[u]) return;
		d[u]=dep;f[u][0]=fa;
		for(auto& v:T[u]) {
			dfs(v,u,dep+1);
		}
		dmax=max(dmax,dep);
		return;
	}
	
	void finit(int s){
		memset(f,0,sizeof(f));
		memset(d,0,sizeof(d));
		dfs(s,s,1);init(s);
	}
}solve;
signed main(){
    ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1,u,v;i<n;i++){
		cin>>u>>v;
		T[u].push_back(v);
		T[v].push_back(u);
	}
	solve.finit(1);
	for(int i=1,a,b,c;i<=m;i++){
		cin>>a>>b>>c;
		int x1=solve.query(a,b),x2=solve.query(b,c),x3=solve.query(a,c);
		if (x1==x2){
			int ans=abs(solve.d[x3]-solve.d[a])+abs(solve.d[x3]-solve.d[c]);
			ans+=abs(solve.d[x1]-solve.d[b])+abs(solve.d[x1]-solve.d[x3]);
			cout<<x3<<' '<<ans<<endl;
		}
		else if(x1==x3){
			int ans=abs(solve.d[x2]-solve.d[c])+abs(solve.d[x2]-solve.d[b]);
			ans+=abs(solve.d[x3]-solve.d[a])+abs(solve.d[x3]-solve.d[x2]);
			cout<<x2<<' '<<ans<<endl;
		}
		else{
			int ans=abs(solve.d[x1]-solve.d[a])+abs(solve.d[x1]-solve.d[b]);
			ans+=abs(solve.d[x2]-solve.d[c])+abs(solve.d[x2]-solve.d[x1]);
			cout<<x1<<' '<<ans<<endl;
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/368534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第42天 | 01背包问题,你该了解这些! 01背包问题,你该了解这些! 滚动数组 416. 分割等和子集

目录 01背包问题&#xff0c;你该了解这些&#xff01; 01 背包 二维dp数组01背包 &#x1f4bb;实现代码 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 一维dp数组&#xff08;滚动数组&#xff09; &#x1f4bb;实现代码 416. 分割等和子集 &#x1f…

《Numpy 简易速速上手小册》第9章:Numpy 在机器学习中的应用(2024 最新版)

文章目录 9.1 数据预处理9.1.1 基础知识9.1.2 完整案例&#xff1a;数据标准化9.1.3 拓展案例 1&#xff1a;缺失值处理9.1.4 拓展案例 2&#xff1a;非数值数据的转换 9.2 特征提取和处理9.2.1 基础知识9.2.2 完整案例&#xff1a;特征归一化9.2.3 拓展案例 1&#xff1a;特征…

MySQL知识点总结:构建可靠高性能的关系型数据库

摘要&#xff1a;MySQL是一款广泛使用的开源关系型数据库管理系统&#xff0c;具备可靠性和高性能的特点。本文将总结MySQL的一些重要知识点&#xff0c;帮助读者了解如何使用MySQL构建可靠高性能的关系型数据库。 正文&#xff1a; ### 1. 数据类型 MySQL支持多种数据类型&…

SpringBoot整合Activiti7—— 补偿边界/补偿中间事件(十五)

文章目录 补偿边界/补偿中间事件代码实现xml文件测试流程流程执行步骤 补偿边界/补偿中间事件 补偿事件可以被触发来回滚或修复之前已经完成的任务或活动。 补偿事件通常与错误边界事件&#xff08;Error Boundary Event&#xff09;结合使用。当任务或活动发生异常时&#xff…

SQL sever2008中创建用户并赋权

一、创建数据库dream CREATE DATABASE dream; 二、创建登录用户XZS 法一&#xff1a;使用SSMS创建 通过查询 sys.syslogins 系统视图来确定当前登录是否具有系统管理员权限。执行以下查询语句&#xff1a; SELECT name, isntname FROM sys.syslogins WHERE sysadmin 1;选…

Android Studio从零基础到APP上线(3)

第3章 简单控件 本章介绍App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图,容纳视图的常用布局,响应点击的按钮控件,显示图片的图像视图等。然后结合本章所学的知识,演示一个实战项目“简单计算器”的设计与实现。 3.1 文本显示 本节介绍如何在文本视图Tex…

Jmeter,如何从数组参数中取值

有个post请求&#xff0c;参数“equipment_ids”&#xff0c;是个数组&#xff0c;需求每次执行的时候&#xff0c;按顺序取equipment_ids中不同的值 要实现在 JMeter 中每次执行请求时按顺序取不同的 equipment_ids 中的值&#xff0c;你可以使用 Counter 元件来生成索引&…

【面试深度解析】掌上先机后端面试(Java基础能力夯实)

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

HTML音频标签

新增的语义化的标签&#xff1a; 即直接给了一个具象化的盒子。 新增的多媒体标签&#xff1a; 视频格式&#xff1a; 当都不支持的时候会显示文字。 video仍然是可以看成一个盒子。 音频格式&#xff1a; 新增的input 表单控件&#xff1a; 新增的表单属性&#xff1a; 提示文…

MyBatis 的XML实现方法

MyBatis 的XML实现方法 MyBatis 的XML实现方法前情提示创建mapper接口添加配置创建xml文件操作数据库insert标签delete标签select标签resultMap标签 update标签sql标签,include标签 MyBatis 的XML实现方法 前情提示 关于mybatis的重要准备工作,请看MyBatis 的注解实现方法 创…

Java SWT Composite 绘画

Java SWT Composite 绘画 1 Java SWT2 Java 图形框架 AWT、Swing、SWT、JavaFX2.1 Java AWT (Abstract Window Toolkit)2.2 Java Swing2.3 Java SWT (Standard Widget Toolkit)2.4 Java JavaFX 3 比较和总结 1 Java SWT Java SWT&#xff08;Standard Widget Toolkit&#xff…

Power BI案例-链接Mysql方法

Power BI案例-连锁Mysql 方法1-通过组件mysql-connector-net-8.3.0&#xff1a; 选择文件–获取数据–选择MySQL数据库–选择链接 提示无组件&#xff0c;选择了解详细情况 弹出浏览器&#xff0c;选择下载 不用登陆&#xff0c;可以直接下载 下载的组件如下&#xff1a…

【开源】基于JAVA+Vue+SpringBoot的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

代码随想录算法训练营Day46|139.单词拆分、多重背包理论基础、背包问题总结

目录 139.单词拆分 方法一&#xff1a;回溯法 算法实现 方法二&#xff1a;背包问题 算法实现 多重背包理论基础 思路 算法实现 背包问题总结 前言 背包递推公式 遍历顺序 0-1背包 完全背包 139.单词拆分 题目链接 文章链接 方法一&#xff1a;回溯法 在回溯专题…

Endnote常见设置(硕士毕业论文参考文献修改)

1、根据大多数期刊或学校使用的标准&#xff0c;英文名首字母大写后续字母小写。 2、需要手动调整Endnote中的参考文献相关内容 3、关于姓名大小写设置 AS IS是不更改大小写&#xff0c;EndNote库中文献的大小是什么样&#xff0c;Word中就显示什么样。选择Normal为首字母大…

HDMI2.1之eARC简介-Dolby Atmos和DTS:X

文章目录 eARC目的更大的带宽更高质量音频支持对象型音频与CEC&#xff08;Consumer Electronics Control&#xff09;的兼容性&#xff1a; 适应流媒体发展Dolby AtmosDTS:X高分辨率音频更高的音频位深度和采样率低延迟音频 对象型音频格式独立对象三维定位动态音场适应性和灵…

嵌入式——串行外围设备接口(SPI)

目录 一、初识SPI 1. 介绍 2. 特性 补&#xff1a; 二、物理层 1. SS &#xff08;Slave Select&#xff09; 2. SCK &#xff08;Serial Clock&#xff09; 3. MOSI &#xff08;Master Output, Slave Input&#xff09; 4. MISO &#xff08;Master Input&#xff0…

虚拟机Windows Server 2016 安装 MySQL8

目录 一、下载MySQL8 1.下载地址&#xff1a; 2.创建my.ini文件 二、安装步骤 第一步&#xff1a;命令窗口 第二步&#xff1a;切换目录 第三步&#xff1a;安装服务 第四步&#xff1a;生成临时密码 第五步&#xff1a;启动服务 第六步&#xff1a; 修改密码 三…

【Linux系统化学习】进程替换

目录 进程程序替换 替换原理 ​编辑替换函数 函数解释 命名理解 函数使用 execl execlp execv execvp 调用其它程序 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个…

0203-2-输入输出系统

第六章&#xff1a;输入输出系统 I/O系统的功能&#xff0c;模型和接口 I/O系统管理的对象是I/O设备和相应的设备控制器。 I/O系统的基本功能 隐藏物理设备的细节与设备的无关性提高处理机和I/O设备的利用率对I/O设备进行控制确保对设备的正确共享错误处理 I/O软件的层次结…