2024.1.26每日一题

LeetCode

边权重均等查询

2846. 边权重均等查询 - 力扣(LeetCode)

题目描述

现有一棵由 n 个节点组成的无向树,节点按从 0n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ui, vi, wi] 表示树中存在一条位于节点 ui 和节点 vi 之间、权重为 wi 的边。

另给你一个长度为 m 的二维整数数组 queries ,其中 queries[i] = [ai, bi] 。对于每条查询,请你找出使从 aibi 路径上每条边的权重相等所需的 最小操作次数 。在一次操作中,你可以选择树上的任意一条边,并将其权重更改为任意值。

注意:

  • 查询之间 相互独立 的,这意味着每条新的查询时,树都会回到 初始状态
  • aibi的路径是一个由 不同 节点组成的序列,从节点 ai 开始,到节点 bi 结束,且序列中相邻的两个节点在树中共享一条边。

返回一个长度为 m 的数组 answer ,其中 answer[i] 是第 i 条查询的答案。

示例 1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入:n = 7, edges = [[0,1,1],[1,2,1],[2,3,1],[3,4,2],[4,5,2],[5,6,2]], queries = [[0,3],[3,6],[2,6],[0,6]]
输出:[0,0,1,3]
解释:第 1 条查询,从节点 0 到节点 3 的路径中的所有边的权重都是 1 。因此,答案为 0 。
第 2 条查询,从节点 3 到节点 6 的路径中的所有边的权重都是 2 。因此,答案为 0 。
第 3 条查询,将边 [2,3] 的权重变更为 2 。在这次操作之后,从节点 2 到节点 6 的路径中的所有边的权重都是 2 。因此,答案为 1 。
第 4 条查询,将边 [0,1]、[1,2]、[2,3] 的权重变更为 2 。在这次操作之后,从节点 0 到节点 6 的路径中的所有边的权重都是 2 。因此,答案为 3 。
对于每条查询 queries[i] ,可以证明 answer[i] 是使从 ai 到 bi 的路径中的所有边的权重相等的最小操作次数。

示例 2:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入:n = 8, edges = [[1,2,6],[1,3,4],[2,4,6],[2,5,3],[3,6,6],[3,0,8],[7,0,2]], queries = [[4,6],[0,4],[6,5],[7,4]]
输出:[1,2,2,3]
解释:第 1 条查询,将边 [1,3] 的权重变更为 6 。在这次操作之后,从节点 4 到节点 6 的路径中的所有边的权重都是 6 。因此,答案为 1 。
第 2 条查询,将边 [0,3]、[3,1] 的权重变更为 6 。在这次操作之后,从节点 0 到节点 4 的路径中的所有边的权重都是 6 。因此,答案为 2 。
第 3 条查询,将边 [1,3]、[5,2] 的权重变更为 6 。在这次操作之后,从节点 6 到节点 5 的路径中的所有边的权重都是 6 。因此,答案为 2 。
第 4 条查询,将边 [0,7]、[0,3]、[1,3] 的权重变更为 6 。在这次操作之后,从节点 7 到节点 4 的路径中的所有边的权重都是 6 。因此,答案为 3 。
对于每条查询 queries[i] ,可以证明 answer[i] 是使从 ai 到 bi 的路径中的所有边的权重相等的最小操作次数。 

提示:

  • 1 <= n <= 104
  • edges.length == n - 1
  • edges[i].length == 3
  • 0 <= ui, vi < n
  • 1 <= wi <= 26
  • 生成的输入满足 edges 表示一棵有效的树
  • 1 <= queries.length == m <= 2 * 104
  • queries[i].length == 2
  • 0 <= ai, bi < n

思路

代码

C++
class Solution {
public:vector<int> minOperationsQueries(int n, vector<vector<int>> &edges, vector<vector<int>> &queries) {vector<vector<pair<int, int>>> g(n);for (auto &e: edges) {int x = e[0], y = e[1], w = e[2] - 1;g[x].emplace_back(y, w);g[y].emplace_back(x, w);}int m = 32 - __builtin_clz(n); // n 的二进制长度vector<vector<int>> pa(n, vector<int>(m, -1));vector<vector<array<int, 26>>> cnt(n, vector<array<int, 26>>(m));vector<int> depth(n);function<void(int, int)> dfs = [&](int x, int fa) {pa[x][0] = fa;for (auto [y, w]: g[x]) {if (y != fa) {cnt[y][0][w] = 1;depth[y] = depth[x] + 1;dfs(y, x);}}};dfs(0, -1);for (int i = 0; i < m - 1; i++) {for (int x = 0; x < n; x++) {int p = pa[x][i];if (p != -1) {int pp = pa[p][i];pa[x][i + 1] = pp;for (int j = 0; j < 26; ++j) {cnt[x][i + 1][j] = cnt[x][i][j] + cnt[p][i][j];}}}}vector<int> ans;for (auto &q: queries) {int x = q[0], y = q[1];int path_len = depth[x] + depth[y]; // 最后减去 depth[lca] * 2int cw[26]{};if (depth[x] > depth[y]) {swap(x, y);}// 让 y 和 x 在同一深度for (int k = depth[y] - depth[x]; k; k &= k - 1) {int i = __builtin_ctz(k);int p = pa[y][i];for (int j = 0; j < 26; ++j) {cw[j] += cnt[y][i][j];}y = p;}if (y != x) {for (int i = m - 1; i >= 0; i--) {int px = pa[x][i], py = pa[y][i];if (px != py) {for (int j = 0; j < 26; j++) {cw[j] += cnt[x][i][j] + cnt[y][i][j];}x = px;y = py; // x 和 y 同时上跳 2^i 步}}for (int j = 0; j < 26; j++) {cw[j] += cnt[x][0][j] + cnt[y][0][j];}x = pa[x][0];}int lca = x;path_len -= depth[lca] * 2;ans.push_back(path_len - *max_element(cw, cw + 26));}return ans;}
};
Java
class Solution {public int[] minOperationsQueries(int n, int[][] edges, int[][] queries) {List<int[]>[] g = new ArrayList[n];Arrays.setAll(g, e -> new ArrayList<>());for (var e : edges) {int x = e[0], y = e[1], w = e[2] - 1;g[x].add(new int[]{y, w});g[y].add(new int[]{x, w});}int m = 32 - Integer.numberOfLeadingZeros(n); // n 的二进制长度var pa = new int[n][m];for (int i = 0; i < n; i++) {Arrays.fill(pa[i], -1);}var cnt = new int[n][m][26];var depth = new int[n];dfs(0, -1, g, pa, cnt, depth);for (int i = 0; i < m - 1; i++) {for (int x = 0; x < n; x++) {int p = pa[x][i];if (p != -1) {int pp = pa[p][i];pa[x][i + 1] = pp;for (int j = 0; j < 26; j++) {cnt[x][i + 1][j] = cnt[x][i][j] + cnt[p][i][j];}}}}var ans = new int[queries.length];for (int qi = 0; qi < queries.length; qi++) {int x = queries[qi][0], y = queries[qi][1];int pathLen = depth[x] + depth[y];var cw = new int[26];if (depth[x] > depth[y]) {int temp = x;x = y;y = temp;}// 让 y 和 x 在同一深度for (int k = depth[y] - depth[x]; k > 0; k &= k - 1) {int i = Integer.numberOfTrailingZeros(k);int p = pa[y][i];for (int j = 0; j < 26; ++j) {cw[j] += cnt[y][i][j];}y = p;}if (y != x) {for (int i = m - 1; i >= 0; i--) {int px = pa[x][i];int py = pa[y][i];if (px != py) {for (int j = 0; j < 26; j++) {cw[j] += cnt[x][i][j] + cnt[y][i][j];}x = px;y = py; // x 和 y 同时上跳 2^i 步}}for (int j = 0; j < 26; j++) {cw[j] += cnt[x][0][j] + cnt[y][0][j];}x = pa[x][0];}int lca = x;pathLen -= depth[lca] * 2;int maxCw = 0;for (int i = 0; i < 26; i++) {maxCw = Math.max(maxCw, cw[i]);}ans[qi] = pathLen - maxCw;}return ans;}private void dfs(int x, int fa, List<int[]>[] g, int[][] pa, int[][][] cnt, int[] depth) {pa[x][0] = fa;for (var e : g[x]) {int y = e[0], w = e[1];if (y != fa) {cnt[y][0][w] = 1;depth[y] = depth[x] + 1;dfs(y, x, g, pa, cnt, depth);}}}
}

image-20240126184903950

image-20240126184910631

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

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

相关文章

三方jar包引入到springboot中 package到jar中正常启动的pom文件怎么写 IDEA

文章目录 场景例子工程引用pom文件&#xff08;打包关键&#xff09;打包后观察 场景 许多时候我们在对接三方的时候&#xff0c;需要下载官方的推荐的SDK&#xff0c;但springboot项目怎么引入额外的三方jar包了&#xff0c;自已通过maven本地坐标的方式尝也不行&#xff0c;…

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024)

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024) 2024 International Conference Big Data Economy and Social Culture 一、【会议简介】 随着大数据技术的飞速发展&#xff0c;全球范围内对大数据经济与社会文化的研究愈发深入。为了促进国际间学术交流…

商业标书制作的艺术与科学

在商业世界中&#xff0c;标书不仅是一份文件&#xff0c;它是企业实力和专业精神的体现&#xff0c;是通往成功竞标的敲门砖。制作一份出色的商业标书&#xff0c;就像是在精心策划一场演出&#xff0c;每一个细节都至关重要。今天&#xff0c;就让我们一起探索商业标书制作流…

数据库系统原理总结之——目录

数据库系统原理总结之——目录 资料说明&#xff1a;主要是对数据库系统原理总结&#xff0c;发布的各个章节总结一个目录方便查看和查找 第一章数据库系统概述 第二章 关系数据库 第三章 数据库设计 第四章 SQL 与关系数据库基本操作 第五章 数据库编程 第六章 数据库安…

PageHelper分页插件-以三层架构模型开发为例

文章目录 1、简介2、使用2.1、导入2.1.1、SpringBoot2.1.2、非SpringBoot 2.2、controller2.3、service2.4、mapper ​&#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、…

智能小程序事件系统——基础交互事件介绍

什么是交互事件 事件是视图层到逻辑层的通讯方式。事件可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上。当达到触发事件&#xff0c;就会执行逻辑层中对应的事件处理函数。事件对象可以携带额外信息&#xff0c;如 id、dataset 和 touches。 事件分类 事件分为…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

25从零开始用Rust编写nginx,序列化之serde是如何工作的

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器&#xff0c;四层TCP/UDP转发&#xff0c;内网穿透&#xff0c;后续将实现websocket代理等&#xff0c;会将实现过程分享出来&#xff0c;感兴趣的可以一起造个轮子 项目地址 国内: https:…

SQL字符串截取函数【简笔记】

MySQL提供了多种字符串函数来处理和截取字符串。下面是一些常用的字符串截取函数及其使用示范&#xff1a; SUBSTRING(str, pos, len) str 是要截取的字符串。pos 是开始截取的位置。len 是截取的长度。 示例: SELECT SUBSTRING(Hello, World!, 8, 5); -- 结果: "World…

实验一:FIRST集

前置知识 1.vector基本操作https://c.biancheng.net/view/6749.html2.set基本操作https://c.biancheng.net/view/7196.html 核心操作 //G文法结构体 struct G {int Vt_number;int Vn_number;int P_number;set<char> Vt;set<char> Vn;char S;vector<string>…

ConcurrentHashMap详解

ConcurrentHashMap详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;在今天的文章中&#xff0c;我们将深入探讨Java中的一个重要类——ConcurrentHashMap。这是一个在多线程环境下高效操作的线程安全的哈希表&#xff0c;让我们…

ERD Online:数据建模与元数据管理的未来

ERD Online&#xff1a;数据建模与元数据管理的未来&#x1f31f; 在数字化时代&#xff0c;数据是企业的核心资产。如何高效、安全地管理这些数据成为企业面临的一大挑战。今天&#xff0c;我要介绍的这个平台&#xff0c;可能是你正在寻找的解决方案——它就是 ERD Online&am…

企业级大数据安全架构(六)数据授权和审计管理

作者&#xff1a;楼高 本节详细介绍企业级大数据架构中的第六部分&#xff0c;数据授权和审计管理 1.Ranger简介 Apache Ranger是一款被设计成全面掌管Hadoop生态系统的数据安全管理框架&#xff0c;为Hadoop生态系统众多组件提供一个统一的数据授权和管理界面&#xff0c; 管…

怎么创建facebook广告

创建Facebook广告的文章应由本人根据自身实际情况书写&#xff0c;以下仅供参考&#xff0c;请您根据自身实际情况撰写。 创建Facebook广告的步骤&#xff1a; 确定目标受众和广告主题&#xff1a;首先需要明确你的目标受众是谁&#xff0c;他们有什么特点&#xff0c;以及你想…

蓝桥杯2024/1/28----十二届省赛题笔记

题目要求&#xff1a; 2、 竞赛板配置要求 2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。 2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。 2.3扩展方式跳线 J13 配置为 IO 模式。 2.4 请注意 &#xff1a; 选手需严格按照以上要求配置竞赛板&#xff0c;编写和调…

APT32F1023X 发送RF433处理

1.硬件电路--CMT2110A 需要注意&#xff1a;发射端MCU写数据的频率要匹配&#xff0c;如果MCU发送中时间最小脉宽是1MS&#xff0c;那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…

Matlab基础语法

基础语法 %% Matlab基本的小常识 % (1)在每一行的语句后面加上分号(一定要是英文的哦;中文的长这个样子&#xff1b;)表示不显示运行结果 a 3; a 5% (2)多行注释:选中要注释的若干语句,快捷键CtrlR % a 3; % a 5% (3)取消注释:选中要取消注释的语句,快捷键CtrlT % 我想要取…

【机器学习300问】20、什么是神经网络?和深度学习什么关系?

在学习深度学习的相关知识之前&#xff0c;我们首先得了解什么是神经网络&#xff0c;解开神经网络的神秘面纱后&#xff0c;什么是深度学习的问题也就迎刃而解。我依旧会采用我习惯的方式&#xff1a;先给出例子直观理解&#xff0c;在给出定义深入理解&#xff0c;最后在实际…

Ubuntu 系统如何修改时间

Ubuntu 系统如何修改时间 简介&#xff1a;在Ubuntu上&#xff0c;你可以使用以下三种方法来修改时间&#xff1a;date命令&#xff0c;timedatectl命令和hw 原文&#xff1a;Ubuntu 系统如何修改时间 (baidu.com)https://cloud.baidu.com/article/393621 三种方法修改Ubunt…

python中tuple元组的作用是什么

在Python中&#xff0c;tuple&#xff08;元组&#xff09;是一种不可变序列&#xff0c;可以存储不同类型的数据。 有以下几个作用&#xff1a; 用于存储多个相关的值&#xff1a;tuple是一个容器&#xff0c;可以用于存储多个值&#xff0c;这些值可以是不同类型的数据。例如…