P8805 [蓝桥杯 2022 国 B] 机房

news2024/12/23 10:38:16

P8805 [蓝桥杯 2022 国 B] 机房

分析

是一道lca题目,可以直接套模板 + 前缀和处理点权

具体思路:

1.n台电脑用n-1条网线相连,任意两个节点之间有且仅有一条路径(拆分成各自到公共祖先节点的路径——lca);

2.“延迟时间”:看成是节点点权(要求一条链上某个区间的值——前缀和)

——用sum[]存储根节点到 i 节点的点权和

LCA

三种求法:

(1)朴素求法:

先将两点位于同一深度,然后同时向上跳;一次查询:O(n^2)

(2)倍增求法:

朴素求法的改进版(朴素是一步一步跳,倍增是用f[][]优化,每次向上都是以其父节点为目标)

(3)Tarjan(留一下,还没学~)

倍增求法的步骤:

1.存图/树

2.dfs(int x,int father)更新f[][](表示节点 i 的第2^j个祖先节点)、d[](深度)

(1)更新d[x]和f[x][0]

(2)for(1~20)更新f[x][i]

(3)for(遍历邻接点)递归dfs()

3.lca

(1)先将两点跳到同一深度(深度大的往上跳)

(2)若相等,则该点就是lca;若不相等,则从大到小,如果f[][]不等,则更新两点,lca=f[x][0]

代码 

#include<iostream>
#include<cstring>
using namespace std;

const int N = 100010;
int head[N],d[N],f[N][30],a[N],sum[N],cnt,n,m;
struct edges{
	int to;
	int ne;
}e[N*2];//存两条边记得数组开成2倍

//初始化别忘了(容易忘建议直接写main中)
void init()
{
	memset(head,-1,sizeof head);
}
//链式前向星存边
void addedge(int u,int v)
{
	e[cnt].to = v;
	e[cnt].ne = head[u];
	head[u] = cnt ++;
}
//dfs处理d[]、f[][]、sum[]
void dfs(int x,int father)
{
	d[x] = d[father] + 1;
	f[x][0] = father;
	sum[x] = sum[f[x][0]] + a[x];  //lca模板多了这一步~
	for(int i = 1;i <= 20;i ++)
	{
		f[x][i] = f[f[x][i-1]][i-1];
	}
	for(int i = head[x];i != -1;i = e[i].ne)
	{
		int j = e[i].to;
		if(j == father) continue; //加的是双向边,所以邻接点有其父节点,遍历时跳过
		dfs(j,x);	//递归遍历
	}
	return ;
}
//lca找到最近公共祖先节点
int lca(int u,int v)
{
	if(d[u] < d[v]) swap(u,v);
		for(int i = 20;i >= 0;i --)
		{
			if(d[f[u][i]] >= d[v]) u = f[u][i];
		}
		if(u == v)
		{
			return u;
		}
		for(int i = 20;i >= 0;i --)
		{
			if(f[u][i] != f[v][i])
			{
				u = f[u][i];
				v = f[v][i];
			}
		}
		return f[u][0];
}

int main()
{
	init();
	scanf("%d %d",&n,&m);
	for(int i = 0;i < n - 1;i ++)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		a[u] ++,a[v] ++;
		addedge(u,v),addedge(v,u);
	}
	dfs(1,0);
	while(m --)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		int mid = lca(u,v);
		int ans = sum[u] + sum[v] - 2 * sum[mid] + a[mid];  //两点之间的权值和
		printf("%d\n",ans);
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MLP的代替:KAN

受柯尔莫哥洛夫-阿诺德表示定理的启发&#xff0c;作者提出柯尔莫哥洛夫-阿诺德网络&#xff08;KAN&#xff09;作为多层感知器&#xff08;MLP&#xff09;有前途的替代品。MLP 在节点&#xff08;“神经元”&#xff09;上具有固定的激活函数&#xff0c;而 KAN 在边&#x…

SAP CS07复制BOM简介

在比较大型的集团公司中会应用到这样一个场景,所有的BOM都是由总部研发统一管控,然后在下发到下属的工厂进行生产,当发生变更的时候BOM也是会随之进行变更。 同样的在相同的两家工厂中,使用的是一套的设计方案,并且当物料发起变更的时候BOM也要随之进行变更处理。 在对BO…

Linux程序开发(一):Linux基础入门安装和实操手册

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

C语言之旅:自定义类型(联合和枚举)

目录 一.联合体 1.1 联合体的声明 1.2 联合体的使用 1.3 为什么输出 4呢&#xff1f; 1.4 相同成员的结构体和联合体对比 1.5 联合体大小对比 1.6使用联合体判断大小端 二.枚举类型 2.1枚举类型的例举&#xff1a; 2.2枚举类型的优点 2.3 枚举类型的使用 在上篇文章中…

如何利用命令提示符列出文件?这里提供了几个实例供你参考

序言 什么命令可以用来列出目录中的文件&#xff1f;如何在命令提示符Windows 10/11中列出文件&#xff1f;很多人对这些问题感到困惑。在这篇文章中&#xff0c;我们详细解释了命令提示符列出文件的主题。 CMD&#xff08;命令提示符&#xff09;是一个功能强大的Windows内置…

Python学习之路 | Python基础语法(二)

Python3 面向对象 封装、继承、多态。 基础 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法&#xff1a;类中定义的函数。类变量&#xff1a;类变量在整个实例化的对象中是公用的。类变量定义在类中…

与禹老师学前端vue3学习汇总

24.5.15&#xff1a; 创建Vue3工程 1.确定自己电脑有没有nodejs环境&#xff0c;在cmd中输入node&#xff0c;如果出现Node.js的版本号说明已经有这个环境了&#xff0c;否则搜索Node.js安装 2.先在D盘创建一个文件夹Vue3_Study&#xff0c;然后在这个空文件夹中右键选择终端…

【069】基于SpringBoot+Vue实现的企业资产管理系统

系统介绍 基于SpringBootVue实现的企业资产管理系统管理员功能有个人中心&#xff0c;用户管理&#xff0c;资产分类管理&#xff0c;资产信息管理&#xff0c;资产借出管理&#xff0c;资产归还管理&#xff0c;资产维修管理。用户可以对资产进行借出和归还操作。因而具有一定…

Git系列:Git Switch 高效使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

实时网络监控 - 一目了然网络状况

网络问题排查一直是IT管理员头痛的问题。随着网络规模的不断扩大和业务复杂度的提升&#xff0c;如何快速定位和解决网络故障变得尤为关键。本文详细介绍了一款名为 AnaTraf 的网络流量分析工具,它能提供全流量回溯分析、实时网络监控、性能分析等功能,助力企业快速诊断和解决各…

每日两题 / 236. 二叉树的最近公共祖先 124. 二叉树中的最大路径和(LeetCode热题100)

236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; dfs统计根节点到p&#xff0c;q节点的路径&#xff0c;两条路径中最后一个相同节点就是公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

鸿蒙 DevEcoStudio:简单实现网络请求登录案例

使用http或axios实现登录案例 在entry/src/main/ets/pages路径下新建Page9.ets文件&#xff1a; import http from ohos.net.http import router from ohos.router Entry Component struct Page9 {State message: string Hello WorldState username: string State password:…

学习了java编程后,你就只能做java程序员吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 学习了Java编程后&#xff0c;…

KNN算法用于回归分析

生成数据集 from sklearn.datasets import make_regression import matplotlib.pyplot as plt# 生成特征数量为1&#xff0c; 噪音为50的数据集 X, y make_regression(n_features1, n_informative1, noise50, random_state8)# 散点图 plt.scatter(X, y, c"orange",…

CTF例题:[SWPU2019]Web1(无列名注入)

网址&#xff1a;BUUCTF在线评测 搜索web1 启动靶机 点击链接进入题目 进入题目后发现有登录和注册接口&#xff0c;直接注册登录。 首先通过1进行测试&#xff0c;查看是否有注入点 出现报错&#xff0c;说明可能存在注入点 然后继续测试发现该服务器过滤了&#xff1a; or、…

SFTPGO 整合minio AD群组 测试 |sftpgo with minio and ldap group test

SFTP-GO 研究 最近在测试sftpgo&#xff0c;发现中文的资料比较少&#xff0c;在企业中很多存储开始支持S3&#xff0c;比如netapp 于是想尝试把文件服务器换成sftpgoS3的存储&#xff0c;sftp go和AD 群组的搭配测试比较少 自己测试了一把&#xff0c;觉得还是没有server-u的A…

三类银行互联网贷款迎新规!速看菊风信贷智能双录解决方案

​​继2020年《商业银行互联网贷款管理暂行办法》&#xff08;下称《办法》&#xff09;和2021年《关于进一步规范商业银行互联网贷款业务的通知》之后&#xff0c;时隔三年&#xff0c;股份制银行、城商行、民营银行&#xff08;简称“三类银行”&#xff09;互联网贷款业务再…

shell脚本实现linux系统自动化配置免密互信

目录 背景脚本功能脚本内容及使用方法 1.背景 进行linux自动化运维时需要先配置免密&#xff0c;但某些特定场景下&#xff0c;做了互信的节点需要取消免密&#xff0c;若集群庞大节点数量多时&#xff0c;节点两两之间做互信操作非常麻烦&#xff0c;比如有五个节点&#x…

C++二叉搜索树搜索二叉树二叉排序树

C二叉搜索树 1. 二叉搜索树的概念 二叉搜索树&#xff08;BST,Binary Search Tree)&#xff0c;也称为二叉排序树或二叉查找树。它与一般二叉树的区别在于&#xff1a;每个结点必须满足“左孩子大于自己&#xff0c;右孩子小于自己”的规则。在这种规则的约束下&#xff0c;二…

海外云手机的运作原理和适用场景

海外云手机是一种基于云计算技术的虚拟手机服务&#xff0c;通过将手机操作系统和应用程序托管在远程服务器上&#xff0c;实现用户可以通过互联网连接来使用和管理手机功能&#xff0c;而无需实际拥有物理手机。以下是有关海外云手机的相关信息&#xff1a; 海外云手机的运作原…