当前位置: 首页 > news >正文

2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离

2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给定一棵包含 n n n 个顶点的树 T T T ,以及 m m m 个查询请求。每个查询包含三个参数 : x 、 y :x、y :xy k k k。其中 x x x y y y 是树中的两个顶点, k k k 是一个整数。对于每个查询,你需要计算树中所有顶点到从 x x x y y y 的简单路径上的最近距离恰好为 k k k 的顶点数量。

输入描述:

第一行,两个正整数n和m。 ( 1 ≤ n , m ≤ 1 e 5 ) (1≤n,m≤1e5) 1n,m1e5
接下来 n − 1 n-1 n1 行,每行两个正整数 x , y x,y x,y 。点 x x x 和点 y y y 之间有一条边。 ( 1 ≤ x , y ≤ n ) (1≤x,y≤n) 1x,yn)
最后 m m m 行,每行三个正整数 x , y , k x,y,k xyk ( 1 ≤ x , y ≤ n , 1 ≤ k ≤ 100 ) (1≤x,y≤n,1≤k≤100) 1x,yn1k100

输出描述:

对于每次询问,输出一个整数作为答案
每个答案占一行

示例1

输入

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

输出

2
1

由于 k k k 较小,我们可以先用一个简单的树形 DP 预处理出每个节点的子树中距离该节点距离为 0 − k 0-k 0k 的节点数量,
记为 d p [ n ] [ k ] dp[n][k] dp[n][k]
然后再进行一次换根 DP,计算每个节点的非子树节点距离该节点的距离为 0 − k 0-k 0k 的节点数量。同时分别给子树中
距离该节点的距离为 0 − k 0-k 0k d p dp dp 数组做一个根节点到该位置路径上的前缀和。
对于每个查询 :

  1. 先计算 x x x y y y的最近公共祖先 LCA。
  2. 在以 LCA 为根的子树中,到达 x − y x-y xy 简单路径距离为 d d d 的节点数量
    pre[x][k] + pre[y][k] - 2 * pre[w][k] + dp[w][k]) - (pre[x][k - 1] + pre[y][k - 1] - 2 * pre[w][k - 1]) + f[w][k]
    (通过前缀和计算,在以一个节点为根的子树中,到该节点距离为 d − 1 d-1 d1 的节点到其父节点的距离为 d d d ,但是这些节点并不符合题意,故减去)。
  3. 再加上距离 LCA 为 的非子树节点数量。
  4. 总的结果就是上面两项相加。

总的时间复杂度:
预处理树形 DP 和换根 DP 均为 O ( n k ) O(nk) O(nk)
查询时,计算最近公共祖先为 O ( l o g n ) O(logn) O(logn) ,计算结果为 O ( 1 ) O(1) O(1)
共有 q q q 次查询。
故总的时间复杂度为 O ( n × k + q × l o g n ) O(n×k+q×logn) O(n×k+q×logn)

import java.io.*;
import java.util.ArrayList;public class Main {static int N = 100010;static ArrayList[] e = new ArrayList[N];static int[][] dp = new int[N][110];static int[][] f = new int[N][110];static long[][] pre = new long[N][110];static int[] dep = new int[N];static int[][] fa = new int[N][21];public static void dfs_1(int u, int fr) {dp[u][0] = 1;dep[u] = dep[fr] + 1;fa[u][0] = fr;for (int i = 1; i <= 20; i++) {fa[u][i] = fa[fa[u][i - 1]][i - 1];}for (Object v : e[u]) {int j = (int) v;if (j == fr) continue;dfs_1(j, u);for (int i = 1; i <= 100; i++)dp[u][i] += dp[j][i - 1];}}public static void dfs_2(int u, int fr) {for (Object v : e[u]) {int j = (int) v;if (j == fr) continue;for (int i = 1; i <= 100; i++) {f[j][i] = dp[u][i - 1] + f[u][i - 1];if (i >= 2) f[j][i] -= dp[j][i - 2];}dfs_2(j, u);}}public static void dfs_3(int u, int fr) {for (int i = 0; i <= 100; i++) {pre[u][i] = dp[u][i] + pre[fr][i];}for (Object v : e[u]) {int j = (int) v;if (j == fr) continue;dfs_3(j, u);}}public static int LCA(int u, int v) {if (dep[u] < dep[v]) {int t = u;u = v;v = t;}int k = dep[u] - dep[v];for (int i = 0; i <= 20; i++) {if ((k & (1 << i)) != 0) {u = fa[u][i];}}if (u == v) return u;for (int i = 20; i >= 0; i--) {if (fa[u][i] != fa[v][i]) {u = fa[u][i];v = fa[v][i];}}return fa[u][0];}public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));String[] str = bf.readLine().split(" ");int n = Integer.parseInt(str[0]);int m = Integer.parseInt(str[1]);for (int i = 0; i <= n; i++) {e[i] = new ArrayList();}for (int i = 1; i <= n - 1; i++) {str = bf.readLine().split(" ");int x = Integer.parseInt(str[0]);int y = Integer.parseInt(str[1]);e[x].add(y);e[y].add(x);}dfs_1(1, 0);dfs_2(1, 0);dfs_3(1, 0);while (m-- > 0) {str = bf.readLine().split(" ");int x = Integer.parseInt(str[0]);int y = Integer.parseInt(str[1]);int k = Integer.parseInt(str[2]);int w = LCA(x, y);bw.write((pre[x][k] + pre[y][k] - 2 * pre[w][k] + dp[w][k]) - (pre[x][k - 1] + pre[y][k - 1] - 2 * pre[w][k - 1]) + f[w][k] + "\n");}bw.close();}
}

相关文章:

2023河南萌新联赛第(二)场:河南工业大学 F - 最短距离

2023河南萌新联赛第&#xff08;二&#xff09;场&#xff1a;河南工业大学 F - 最短距离 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 给定一棵包含 n n n 个顶点的树…...

前端文件上传实践与后端处理——文件分块上传

文件上传是现代Web应用程序中常见的功能之一。在这篇博客中&#xff0c;我们将探讨一个简单但完整的前端文件上传实践&#xff0c;同时提供一个后端示例&#xff0c;演示如何处理上传的文件。我们将使用JavaScript作为前端语言&#xff0c;并结合Node.js作为后端环境。让我们开…...

SFP6012A-ASEMI代理海矽美快恢复二极管参数、尺寸、规格

编辑&#xff1a;ll SFP6012A-ASEMI代理海矽美快恢复二极管参数、尺寸、规格 型号&#xff1a;SFP6012A 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247AC 恢复时间&#xff1a;100ns 正向电流&#xff1a;60A 反向耐压&#xff1a;1200V 芯片大小&#xff1a;102MIL*2…...

githack的安装步骤+一次错误体验

一.githack的安装步骤 1.要在Kali Linux上安装GitHack工具&#xff0c;您可以按照以下步骤操作&#xff1a; 打开终端并使用以下命令克隆GitHack存储库&#xff1a; git clone https://github.com/lijiejie/GitHack.git2.进入GitHack目录&#xff1a; cd GitHack3.安装依赖项…...

【Spring框架】SpringBoot创建和使用

目录 什么是SpringBoot&#xff1f;SpringBoot优点创建SpringBootSpringBoot使用 什么是SpringBoot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 SpringBoot优点 1.起步依赖(创建的时候就可以方…...

【C语言项目】多臂井径电子测井成像项目(一)

目录 1、目的和意义2、本章概述3、串口R2324、OpenGL5、开发环境6、环境配置6.1、VS安装OpenGL6.2、虚拟串口生成工具 7、成品速览参考文献 1、目的和意义 本项目为获取矿藏地层的油气当量和及时精确地测量含油、含气层的压力及温度值的需求&#xff0c;辅助生产管理人员完成对…...

力扣 56. 合并区间

题目来源&#xff1a;https://leetcode.cn/problems/merge-intervals/description/ C题解&#xff1a;根据左区间排序&#xff0c;更新每一段的右区间最大值&#xff0c;直到间断。 class Solution { public:static bool cmp(vector<int> & a, vector<int> &a…...

前端开发Vue3.0 标签setup语法『UI组件库』之『模态框』【业务提升必备】

封装模态框需要定义的参数 title //弹窗标题 show // 是否显示弹窗 width // 弹窗宽度 height // 弹窗高度 borderRadius // 弹窗圆角 headerColor // 弹窗顶部颜色 contentText // 内容文本 contentTextCorder //内容文本颜色 position // 标题的位置 …...

在CSDN学Golang云原生(Kubernetes二开)

一&#xff0c;通过client-go管理集群资源 Kubernetes提供了client-go库&#xff0c;该库可以让开发人员使用Golang编写的应用程序与Kubernetes API进行交互。通过client-go&#xff0c;你可以创建、更新和删除Kubernetes资源&#xff0c;并查询集群状态等信息。 以下是一个示…...

chatglm-6b量化推理指标记录

chatglm量化推理指标对比&#xff0c;单卡显存32G, 保持batchsize为64不变。通过不同的量化可以节省显存进而提升提升batch size&#xff0c;加快全量数据的推理速度。当然通过量化可以降低大模型的显存使用门槛。...

Android kotlin系列讲解之最佳的UI体验 - Material Design 实战

目录 一、什么是Material Design二、Toolbar三、滑动菜单1、DrawerLayout2、NavigationView 四、悬浮按钮和可交互提示1、FloatingActionButton2、Snackbar3、CoordinatorLayout 五、卡片式布局1、MaterialCardView2、AppBarLayout 六、可折叠式标题栏1、CollapsingToolbarLayo…...

链表基础知识

一、什么是链表 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构是多式多样的&#xff0c;当时通常用的也就是两种&#xff1a; &#xff08;1&#xff09;第一种是无头非循环单向…...

process.env.npm_config_argv的值3个参数remain、cooked、original什么含义

在使用Webpack进行打包时&#xff0c;判断process.env.npm_config_argv的值通常是为了根据命令行参数来决定打包的行为。process.env.npm_config_argv是一个环境变量&#xff0c;保存了当前运行的npm命令和其参数。 具体而言&#xff0c;process.env.npm_config_argv的值是一个…...

【飞书】飞书导出md文档 | 飞书markdown文档导出 | 解决飞书只能导出pdf word

一、飞书导出markdown github地址&#xff1a;https://github.com/Wsine/feishu2md 这是一个下载飞书文档为 Markdown 文件的工具&#xff0c;使用 Go 语言实现。 请看这里&#xff1a;招募有需求和有兴趣的开发者&#xff0c;共同探讨开发维护&#xff0c;有兴趣请联系。 二、…...

零信任网络架构与实现技术的研究与思考

目前&#xff0c;国外已有较多有关零信任网络的研究与实践&#xff0c;包括谷歌的 BeyondCorp、BeyondProd&#xff0c;软件定义边界&#xff08;Software Defined Perimeter&#xff0c;SDP&#xff09; 及盖特提出的“持续自适应风险与信任评估”等。国内也有不少安全厂商积极…...

Unity 性能优化二:内存问题

目录 策略导致的内存问题 GFX内存 纹理资源 压缩格式 Mipmap 网格资源 Read/Write 顶点数据 骨骼 静态合批 Shader资源 Reserved Memory RenderTexture 动画资源 音频资源 字体资源 粒子系统资源 Mono堆内存 策略导致的内存问题 1. Assetbundle 打包的时候…...

JavaScript与TypeScript的区别

JavaScript和TypeScript是两种不同的编程语言&#xff0c;在一些方面有一些区别。 1. 类型系统&#xff1a;JavaScript是一种动态类型语言&#xff0c;变量的类型是在运行时确定的&#xff0c;并且可以随时更改。而TypeScript引入了静态类型系统&#xff0c;可以在编译时检查代…...

【NetCore】05-使用Autofac增强容器能力

文章目录 1.什么情况下需要引入第三方容器组件2.如何集成Autoface 1.什么情况下需要引入第三方容器组件 基于名称的注入属性注入子容器基于动态代理的AOP 核心扩展点&#xff1a;IServiceProviderFactory 第三方注入容器均使用这个类作为扩展点&#xff0c;将其注入到框架中…...

sparksql参数

Spark参数场景配置 参数类型 参数 参数说明 平台默认值 场景与建议 资源申请 spark.executor.memory Executor Java进程的堆内存大小 即Executor Java进程的Xmx值 2g 默认设置,或者同时等比例增大,最高不超过默认值的3倍,超过的单独拿出来看下 (注意作业是否数据倾斜&…...

STM32读写内部Flash

参考&#xff1a;https://blog.csdn.net/Caramel_biscuit/article/details/131925715 参考&#xff1a;https://blog.csdn.net/qq_36075612/article/details/124087574?spm1001.2014.3001.5502 目录 内存映射内部Flash的构成对内部Flash的写入过程查看工程内存的分布ROM加载空…...

别再傻傻分不清了!手把手教你选对安规电容(X1/X2/Y1/Y2等级详解)

电子工程师必读&#xff1a;安规电容X/Y等级实战选型指南 当你在设计一款家用空气净化器的开关电源时&#xff0c;突然发现EMC测试总是不达标&#xff1b;当你维修一台工业变频器时&#xff0c;发现安规电容爆裂导致设备瘫痪——这些场景背后&#xff0c;往往隐藏着对X1/X2/Y1/…...

STM32H743+CubeMX配置FDCAN实战:如何利用TxFIFO优化FreeRTOS下的CAN通信性能?

STM32H743CubeMX配置FDCAN实战&#xff1a;如何利用TxFIFO优化FreeRTOS下的CAN通信性能&#xff1f; 在嵌入式系统开发中&#xff0c;CAN总线因其高可靠性和实时性被广泛应用于工业控制、汽车电子等领域。当我们将目光投向STM32H743这类高性能微控制器时&#xff0c;其内置的FD…...

停止学习新语言!2026年技术人的反内耗宣言

一、技术内耗的困局&#xff1a;语言焦虑与效率陷阱2026年的技术圈&#xff0c;Python稳居TIOBE榜首&#xff0c;Rust强势崛起&#xff0c;TypeScript重构前端生态……语言迭代的速度远超人类学习极限。测试从业者深陷三重内耗漩涡&#xff1a;工具链绑架&#xff1a;70%自动化…...

Fish Speech 1.5API文档增强:OpenAPI 3.0规范生成与Swagger UI集成

Fish Speech 1.5 API文档增强&#xff1a;OpenAPI 3.0规范生成与Swagger UI集成 1. 引言&#xff1a;为什么需要API文档增强&#xff1f; 在实际开发中&#xff0c;我们经常遇到这样的场景&#xff1a;团队新成员需要快速了解API接口&#xff0c;第三方开发者想要集成语音合成…...

Python程序设计期末考试高频大题精讲:二维列表数据处理实战与深度解析

Python程序设计期末考试高频大题精讲&#xff1a;二维列表数据处理实战与深度解析 摘要&#xff1a;本文以高校计算机科学与技术专业《Python程序设计》期末考试中一道典型大题——“统计学生捐款次数”为切入点&#xff0c;系统讲解二维列表&#xff08;嵌套列表&#xff09;的…...

OPCUA结构体数据处理全解析:C#如何高效读写ExtensionObject中的复杂数据

OPCUA结构体数据处理全解析&#xff1a;C#如何高效读写ExtensionObject中的复杂数据 在工业自动化与物联网系统中&#xff0c;OPCUA协议已成为设备间数据交换的事实标准。当面对复杂的自定义结构体数据时&#xff0c;ExtensionObject的处理往往成为开发者的痛点。本文将深入剖析…...

IBM Plex字体家族全攻略:企业级开源字体的应用与实践

IBM Plex字体家族全攻略&#xff1a;企业级开源字体的应用与实践 【免费下载链接】plex The package of IBM’s typeface, IBM Plex. 项目地址: https://gitcode.com/gh_mirrors/pl/plex 企业级字体解决方案的价值解析 在数字产品设计中&#xff0c;字体作为视觉传达的…...

C语言基础:LiuJuan20260223Zimage嵌入式开发入门

C语言基础&#xff1a;LiuJuan20260223Zimage嵌入式开发入门 1. 学习目标与前置知识 如果你是刚开始接触嵌入式开发的C语言初学者&#xff0c;这篇文章就是为你准备的。我们将从最基础的C语言语法开始&#xff0c;一步步带你了解如何在嵌入式环境中使用C语言进行开发。不需要…...

如何突破Office功能限制?本地化激活方案全解析

如何突破Office功能限制&#xff1f;本地化激活方案全解析 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohook 当…...

Z-Image Turbo实际作品分享:城市风光生成效果

Z-Image Turbo实际作品分享&#xff1a;城市风光生成效果 本文所有内容均为技术效果展示&#xff0c;不涉及任何政治敏感内容&#xff0c;所有案例均为技术演示用途。 1. 效果概览&#xff1a;城市风光的AI艺术呈现 Z-Image Turbo作为基于Gradio和Diffusers构建的高性能AI绘图…...