【蓝桥杯国赛】H 机房

news/2024/5/14 14:19:16/文章来源:https://blog.csdn.net/weixin_62528401/article/details/127270266

蓝桥杯2022年第十三届决赛真题-机房 - C语言网 (dotcpp.com)

题意:

一共有n个结点,n-1条边,因此这是棵树

信息经过一个结点,就会产生一定的延迟,具体延迟的时间等于该结点的度数

每次询问树上两个结点,问两个结点之间路径中所有点度数之和

思路:

树上前缀和+LCA

因为是棵树,对于树上任意两个结点,路径是唯一的

多次询问,如果每次询问都去暴力跑路径的话,复杂度将会是O(qn),会超时

因此我们去求出每个结点离根节点的路径中所有结点的度数之和,相当于去预处理所有结点的前缀和

如下图,黑色的线就是x到根节点的路径,结点x的前缀和就是这条路径上所有结点度数之和

 

 黑色表示结点x前缀和

蓝色表示结点y前缀和

红色表示lca(x,y)前缀和

黄色表示lca(x,y)的父节点的前缀和

那么x到y的路径的结点的度数之和就是 in[x]+in[y]-in[lca(x,y)]-in[st[lca(x,y][0]]

其中in[x]表示结点x到根节点的路径中度数之和

那么我们如何去求每个结点离根节点的前缀和:

bfs或dfs去遍历所有结点,然后从父结点向子结点递推:

dep[u]=dep[st[u][0]]+1;

其中st[u][0]表示结点u的父结点

为了防止爆栈,用bfs比较合适

我们如何去求lca:

首先动态规划预处理st表

 然后对于树上任意两点x,y,先让x和y的深度相等

深度相等之后,让x和y以二进制拆分的倍增往上爬,直到爬到它们的最近公共祖先

Code:

#include <bits/stdc++.h>
using namespace std;
const int mxn=1e5+10,mxe=1e5+10;
struct ty{int to,next;
}edge[mxe<<1];
queue<int> q;
int n,m,x,y,tot=0;
int in[mxn],head[mxn],st[mxn][25],dep[mxn];
void init(){tot=0;for(int i=0;i<=n;i++){head[i]=-1;in[i]=dep[i]=0;for(int j=0;j<mxn;j++) st[i][j]=0;}while(!q.empty()) q.pop();
}
void add(int u,int v){edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;
}
void bfs(){q.push(1);while(!q.empty()){int u=q.front();q.pop();dep[u]=dep[st[u][0]]+1;in[u]+=in[st[u][0]];for(int i=head[u];~i;i=edge[i].next){if(edge[i].to==st[u][0]) continue;st[edge[i].to][0]=u;q.push(edge[i].to);}}
}
int lca(int u,int v){if(dep[u]<dep[v]) swap(u,v);for(int i=19;i>=0;i--){if(dep[st[u][i]]<dep[v]) continue;u=st[u][i];}if(u==v) return u;for(int i=19;i>=0;i--){if(st[u][i]!=st[v][i]){u=st[u][i];v=st[v][i];}}return st[u][0];
}
int main(){scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));//init();for(int i=1;i<=n-1;i++){scanf("%d%d",&x,&y);add(x,y);in[y]++;add(y,x);in[x]++;}bfs();for(int len=1;len<20;len++){for(int i=1;i<=n;i++) st[i][len]=st[st[i][len-1]][len-1];}int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);int tmp=lca(x,y);printf("%d\n",in[x]+in[y]-in[tmp]-in[st[tmp][0]]);}return 0;
}

 

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

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

相关文章

c++学习

C学习Static变量生存期和作用域静态局部变量类的继承多态虚函数纯虚函数&#xff08;接口&#xff09;可见性数组字符串constmutable成员初始化列表三元操作符在堆、栈上创建C实例化对象C运算符和其重载thisC对象的生存期智能指针uniqueptr&#xff08;作用域指针&#xff09;s…

Ubuntu安装微信

1.安装wine sudo dpkg --add-architecture i386 sudo mkdir -pm755 /etc/apt/keyrings sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key//根据你的系统执行不同的命令 Ubuntu 22.04 sudo wget -NP /etc/apt/sources.list.d/…

快乐刷课---Tampermonkey下载使用

TampermonkeyChrome插件伴侣下载资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1IIzB8N2iPW2RjUO2pqDVHw?pwd6666 提取码&#xff1a;6666 1. 下载 Tampermonkey 进入油猴的官网Tampermonkey&#xff0c;下载你使用的浏览器对应的版本 以谷歌浏览器为例&am…

如何计算维吉尼亚密码?Java实现维吉尼亚密码的加密解密算法

文章目录如何计算维吉尼亚密码&#xff1f;Java实现加密算法Java实现解密算法参考博客如何计算维吉尼亚密码&#xff1f; 计算维吉尼亚密码有2种方式&#xff0c;一种是根据密码表查找&#xff0c;另一种是手动计算方法。 1.密码表查找法 第一行是密钥&#xff0c;第一列是明文…

CH579 Cortex-M0 内核低功耗蓝牙 MCU 集成 ARM 内核 32 位微控制器

概述 CH579 是集成 BLE 无线通讯的 ARM 内核 32 位微控制器。片上集成低功耗蓝牙 BLE 通讯模块、以太网控制器及收发器、全速 USB 主机和设备控制器及收发器、段式 LCD 驱动模块、ADC、触摸按键检测模块、RTC 等丰富的外设资源。 特点 32 位 ARM Cortex-M0 内核&#xff0c;…

Arduino常用函数(二)

数学函数 1、min(x,y)函数的作用是返回x&#xff0c;y两者中较小的。 2、max(x,y)函数的作用是返回x&#xff0c;y两者中较大的。 3、abs(x)函数的作用是获取x的绝对值。 4、constrain(amt,low,high)函数的工作过程是&#xff0c;如果amt小于low&#xff0c;则返回low&…

Pytho07--面向对象2

之前我们已经知道了面向对象的概念及在python中创建空类&#xff0c;带方法的类&#xff0c;带初始化方法的类&#xff0c;带实例化方法的类等并认识了类的成员。在我们将其与Java的代码进行对比后发现了python确实有它的方便之处。面向对象的内容不止之前文章中提到的那些&…

IDEA+Tomcat——前端输入数据乱码问题

IDEATomcat——前端输入数据乱码问题 给别人远程部署项目的时候&#xff0c;发现比较老的项目会出现接收前端数据是乱码的问题&#xff0c;但这个项目在我自己的电脑上却是正常的&#xff0c;通过对比发现&#xff0c;IDEA版本或Tomcat版本不同及过低是造成此问题的主要原因&am…

【数学与算法】最小生成树Spanning Trees

链接 无向图&#xff1a; 无向图的意思是&#xff0c;边没有方向。 树&#xff1a; 树是一类特殊的图&#xff0c;树是由节点和无向边构成的&#xff1b; 所有的树都是无向图&#xff0c;但是无向图未必是树&#xff1b; 树有一些性质&#xff0c;但并非所有图都有这些性质…

webrtc防抖动策略NetEq

什么是NetEq:进行抖动控制和丢包隐藏,让音频更平滑。 NetEq的位置 消除抖动的基本原理 NetEq整体架构 NetEq用到的几种缓冲区 NetEq的MCU与DSP NetEq的位置: 网络抖动的计算方式: 两个包在发送端的时间间隔为S,在接收端的间隔为R,那么抖动为J=S-R。 NetEq缓冲区设置多…

golang中struct

前面已经介绍的数组&#xff0c;slice,map有一定的相同之处&#xff0c;即处理的都是相同类型的元素&#xff0c;map中的key和value属于相同的类型&#xff0c;但如果要把多个类型的元素放到一起进行处理&#xff0c;则要使用go语言为我们提供的数据结构struct struct非常适合定…

【Arcgis操作】模块化(批量、自动化)计算多个图层的面积

有很多个图层的面积要计算&#xff0c;如果采用普通的方法&#xff0c;需要给每个图层添加【字段】&#xff0c;然后再挨个计算&#xff0c;图层少的话还好&#xff0c;图层太多的话&#xff0c;很麻烦&#xff0c;很累。 那么&#xff0c;有没有一种方法&#xff0c;能够批量…

OpenCV-Python学习(7)—— OpenCV 轨迹栏操作和键盘响应操作

1. 知识点 cv.namedWindow() 创建一个窗口&#xff1b;cv.createTrackbar() 创建一个轨迹栏&#xff1b;cv.getTrackbarPos() 获取对应轨迹栏的轨迹位置&#xff1b;cv.waitKey() 键盘操作返回对应的key。 2. cv.namedWindow() 函数说明 函数使用 cv.namedWindow(winname, …

【每日算法题】最后一个单词的长度(简单)

今天开始学一学算法✨&#xff0c;前两天研究了下算法&#xff0c;发现算法和数据结构是程序的灵魂&#xff0c;这句话可真没错。 今天先从简单的开始吧&#x1f601;&#xff0c;LeetCode 第 58 题&#xff1a;最后一个单词的长度 题目&#xff1a;给你一个字符串 s&#xf…

Linux下使用WPS做office的二次开发

Linux下使用WPS做office的二次开发 序 上个版本WPS在Linux上就已经支持二次开发了&#xff0c;可以直接去看官网相关的介绍。https://open.wps.cn/ 我们选择WPS的客户端进行二次开发 开发环境 Ubuntu18.04wps-office_11.1.0.9126_amd64.debQt的开发环境&#xff08;我本地…

REACT全家桶(1)

基础 一、特点 声明式设计 高效 减少dom操作 灵活 JSX JS拓展语法 组件 单向响应的数据流 二、虚拟DOM 把真实DOM树转成对象树&#xff0c;再通过diff算法&#xff0c;减少重绘与回流 三、搭建环境&#xff08;提前安装node环境&#xff09; 1.全局安装create-rea…

《图解 HTTP 》阅读笔记(三)

书接上文《图解 HTTP 》阅读笔记&#xff08;二&#xff09;&#xff0c;我们继续探索总结http的相关知识点。 我们还是先把问题摆到台面&#xff0c;带着问题读文章。 6.第九章&第十章 知识点 6.1 HTTP的瓶颈以及相应解决方案 HTTP优缺点分析的时候&#xff0c;我们是相对…

ELK+Filebead+zookeeper+kafka部署

目录 一、为什么要做日志分析平台&#xff1f; 二、ELKFilebeatKafkaZookeeper架构 三、搭建ELKFilebeatKafkaZookeeper 1、3台机子安装zookeeper 192.168.100.14/15/16 1.1 解压安装zookeeper软件包 1.2 修改Zookeeper配置配置文件 1.3 设置myid号以及启动脚本 1.4 3…

【前端修炼场】— 网页到底是添加超链接的呢

此文为【前端修炼场】第六篇&#xff0c;上一篇文章链接&#xff1a;img 标签 文章目录前言一、超链接引入二、属性值介绍2.1 href 属性值2.1.1 在同一文件路径下跳转2.1.2 跳转任意网址2.2 title 属性值2.3 target 属性值总结前言 本篇文章我将带领诸位学习如何在页面中添加超…

GitHub 供应链安全已支持 Dart 开发者生态

通过 Dart 和 GitHub 团队的共同努力&#xff0c;自 10 月 7 日起&#xff0c;GitHub 的 Advisory Database (安全咨询数据库)、Dependency Graph (依赖项关系图) 和 Dependabot (依赖更新机器人) 开始支持 Dart 开发者生态&#xff0c;这也意味着 GitHub 为 Dart 和 Flutter 应…