2846. 边权重均等查询

Powered by:NEFU AB-IN

Link

文章目录

  • 2846. 边权重均等查询
    • 题意
    • 思路
    • 代码

2846. 边权重均等查询

题意

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

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

思路

  1. 保留出现次数最多的边,其余的全部修改
  2. 从 a到b的路径长度 (边数) depth[a]+ depth[b]- depth[lca]* 2, 用倍增求lca
  3. 从 a到b 出现次数最多的边 1<= wi<= 26,统计每种边权的出现次数。可以用counter维护,两个相加即可
    1. 另外 Counter 类的并集和交集操作本质上是对元素计数的最大和最小值操作
    2. 对 某个数据对象用max和min函数时,要注意是否非空!
      https://leetcode.cn/problems/minimum-edge-weight-equilibrium-queries-in-a-tree/solutions/2424060/lca-mo-ban-by-endlesscheng-j54b/

解释一下,cnt[i][j] 是 i 跳 2^j 步路径上的各个边权的数量的统计,可以一直从初始化到维护到查询

代码

# 3.8.19 import
import random
from collections import Counter, defaultdict, deque
from datetime import datetime, timedelta
from functools import lru_cache
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from itertools import combinations, compress, permutations, starmap, tee
from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt
from string import ascii_lowercase, ascii_uppercase
from sys import exit, setrecursionlimit, stdin
from typing import Any, Dict, List, Optional, Tuple, TypeVar, Union# Constants
TYPE = TypeVar('TYPE')
N = int(2e5 + 10)
M = int(20)
INF = int(1e12)
OFFSET = int(100)
MOD = int(1e9 + 7)# Set recursion limit
setrecursionlimit(int(2e9))class Arr:array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)])array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)])graph = staticmethod(lambda size=N: [[] for _ in range(size)])class Math:max = staticmethod(lambda a, b: a if a > b else b)min = staticmethod(lambda a, b: a if a < b else b)class IO:input = staticmethod(lambda: stdin.readline().rstrip("\r\n"))read = staticmethod(lambda: map(int, IO.input().split()))read_list = staticmethod(lambda: list(IO.read()))class Std:class LCA:"""Useing TreeAncestor calculate LCA"""def __init__(self, edges: List[List[int]]):n = len(edges) + 1m = n.bit_length()g = Arr.graph(n)cnt_ = Arr.array2d(Counter, n, m)for x, y, w in edges:  # Node indices start from 0g[x].append((y, w))g[y].append((x, w))depth = Arr.array(0, n)pa = Arr.array2d(-1, n, m)def dfs(x: int, fa: int) -> None:"""Depth-first search to initialize the ancestor table and depth array."""pa[x][0] = fa  # init itselffor y, w in g[x]:if y != fa:depth[y] = depth[x] + 1cnt_[y][0][w] = 1dfs(y, x)dfs(0, -1)for i in range(m - 1):for x in range(n):p = pa[x][i]  # Get the 2^i-th ancestor of node xif p != -1:pp = pa[p][i]  # Get the 2^i-th ancestor of p, which will be the 2^(i+1)-th ancestor of xpa[x][i + 1] = pp  # Set the 2^(i+1)-th ancestor of xcnt_[x][i + 1] = cnt_[x][i] + cnt_[p][i]self.depth = depthself.pa = paself.cnt_ = cnt_def get_kth_ancestor(self, node: int, k: int, cnt_: Counter) -> int:"""Returns the k-th ancestor of the given node (The starting node). That is, jump up k steps"""for i in range(k.bit_length()):if (k >> i) & 1:node_new = self.pa[node][i]cnt_ += self.cnt_[node][i]node = node_newreturn nodedef get_lca(self, x: int, y: int):"""Returns the Lowest Common Ancestor (LCA) of nodes x and y."""cnt_ = Counter()if self.depth[x] > self.depth[y]:x, y = y, x# Bring y and x to the same depthy = self.get_kth_ancestor(y, self.depth[y] - self.depth[x], cnt_)if y == x:return x, max(cnt_.values()) if cnt_ else 0for i in range(len(self.pa[x]) - 1, -1, -1):px, py = self.pa[x][i], self.pa[y][i]if px != py:cnt_ += self.cnt_[x][i]cnt_ += self.cnt_[y][i]x, y = px, py  # Move both nodes up by 2^i stepscnt_ += self.cnt_[x][0]cnt_ += self.cnt_[y][0]return self.pa[x][0], max(cnt_.values()) if cnt_ else 0  # Return the parent of x (or y) as LCA# ————————————————————— Division line ——————————————————————
class Solution:def minOperationsQueries(self, n: int, edges: List[List[int]], queries: List[List[int]]) -> List[int]:lca = Std.LCA(edges)ans = []for a, b in queries:path_len = lca.depth[a] + lca.depth[b]lca_ans, max_len = lca.get_lca(a, b)path_len -= lca.depth[lca_ans] * 2ans.append(path_len - max_len)return ansSolution().minOperationsQueries(7, [[0, 1, 1], [1, 2, 1], [2, 3, 1], [3, 4, 2], [4, 5, 2], [5, 6, 2]], [[0, 3], [3, 6], [2, 6], [0, 6]])

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

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

相关文章

实战:在Spring Boot中使用线程池

在处理高并发请求时&#xff0c;直接创建和销毁线程会带来巨大的开销。线程池通过重用现有的线程来减少这种开销&#xff0c;提高应用的性能和响应速度。SpringBoot提供了便捷的方式来配置和使用线程池。 在SpringBoot中使用线程池&#xff0c;可以有效提高应用的并发处理能力…

MacOS DockerDesktop配置文件daemon.json的位置

如果因为通过可视化页面修改配置错误导致客户端启动不起来&#xff0c;可以去找对应的配置文件通过 vim 修改后重启客户端 cd ~/.docker/

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍&#xff1a; Clipper2在Github上的地址&#xff1a;https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集&#xff08;Intersection&#xff09;、并集&#xff08;Union&#xff09;、差分&#xff08;Difference&…

protobuf编译之后找不到isStringEmpty方法

原因: 与mysql的jar包冲突了 解决办法&#xff1a; 在MySQL中排除proto-java <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version><scope>runtime</scope>&l…

Webpack 从入门到精通

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一、Webpack 简介 二、Webpack 的核心概念 三、Webpack 的安装与配置 安装 Node.js 安装 Webpack 初始…

戴着苹果Vision Pro,如何吃花生米

6月底苹果Vision Pro国内开售&#xff0c;我早早到官网预订了一台。选择必要的配件&#xff0c;输入视力信息&#xff0c;定制符合自己视力的蔡司镜片。确实贵。把主要配件和镜片配齐&#xff0c;要3万6&#xff0c;比Pico、META的眼镜贵一个数量级。 Vision Pro出来后&#x…

C语言之.(结构体,枚举,共用体的应用)

C语言之.(结构体&#xff0c;枚举&#xff0c;共用体的应用) 结构体&#xff0c;套联合体&#xff0c;枚举的应用例子

C语言100基础拔高题(3)

1.利用递归函数调用方式&#xff0c;将所输入的5个字符&#xff0c;以相反顺序打印出来。 解题思路&#xff1a;通过反复调用一个打印最后一个元素的函数&#xff0c;来实现此功能。源代码如下: #include<stdio.h> void oposize(char str[], int len); int main() {//利…

Springboot集成Elasticsearch High Level REST Client实现增删改查实战

获取源码&#x1f6a9; 需要完整代码资料&#xff0c;请一键三连后评论区留下邮箱&#xff0c;安排发送&#xff01;&#xff01;&#xff01;&#x1f916; 什么是High Level REST Client&#xff1f; Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…

ARCGIS PRO DSK GraphicsLayer创建文本要素

一、判断GraphicsLayer层【地块注记】是否存在&#xff0c;如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…

Web 安全之 OOB(Out-of-Band)攻击详解

OOB&#xff08;Out-of-Band&#xff09;攻击是指一种网络安全攻击技术&#xff0c;攻击者利用目标系统与外部资源之间的通信来获取信息或检测漏洞是否存在。这种攻击方式不会通过目标系统的直接响应来显示攻击结果&#xff0c;而是通过外部信道&#xff08;如 DNS、HTTP、SMTP…

用python解释进程与协程(python实例二十八)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.创建进程池&#xff0c;异步执行多个任务 3.1 代码构思 3.2 代码示例 3.3 运行结果 4. 模拟协程堵塞 4.1 代码构思 4.2 代码示例 4.3 运行结果 5.总结 1.认识Python Python 是一个高…

Javascript前端面试(七)

JavaScript 部分 1. JavaScript 有哪些数据类型&#xff0c;它们的区别&#xff1f; JavaScript 共有八种数据类型&#xff0c;分别是 Undefined、Null、Boolean、 Number、String、Object、Symbol、BigInt。 其中 Symbol 和 BigInt 是 ES6 中新增的数据类型&#xff1a; ●Sym…

指标体系建设的方法论

一、分析痛点 了解当前数仓侧与业务应用方对指标到不到、难使用的痛点及日常指标使用习惯&#xff0c;制定指标中心所需功能并设计指标中心样式。 二、指定指标规范 定义指标类型、指标使用方、确定指标域(这里是数据域)、指标要具备的属性(业务/技术口径、负责人、类型等)。 …

多元多项式方程组任意精度求解程序

项目地址&#xff1a; https://gitee.com/tianwangwxm/polynomial-equation运行结果 D:\src\Twwxm2DKernel\cmake-build-release-cygwin\TwWxm2DKernel.exe 已知方程组&#xff1a; ───────────────────────────────────────────…

04-Charles中的Map Remote和Map Local介绍

Charles提供了Map Remote和Map Local两个功能。 Map Remote是将指定的网络请求重定向到另一个网址。Map Local是将指定的网络请求重定向到本地文件。 一、Map Remote 假设代码中调用了接口A&#xff0c;但是接口A的响应结果不能满足需求&#xff1b;此时&#xff0c;有另一个…

SAPUI5基础知识18 - 自定义CSS和主题色

1. 背景 在上一篇博客中&#xff0c;我们通过使用SAPUI5提供的CSS类实现元素间距的调整。在本篇博客中&#xff0c;让我们看一下如何实现自定义的CSS样式。 2. 背景知识 2.1 CSS基础语法 CSS&#xff0c;全称为级联样式表&#xff08;Cascading Style Sheets&#xff09;&a…

【更新2023】省级农林牧渔业产值面板数据 含分项 1949-2023

省级农林牧渔业产值面板数据是研究农业经济和区域发展的重要资源。这些数据可以被用来分析不同省份间农业产值的时空变化及其影响因素&#xff0c;探讨政策对农业发展的影响&#xff0c;评估农业现代化和可持续发展水平&#xff0c;以及比较不同地区农业产值的竞争力和效率。此…

python学习笔记——字符串

一、创建字符串 1.我们可以使用引号( 或 " )来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。 var1 Hello World! var2 "Runoob" 二、访问字符串中的值 1.Python 访问子字符串&#xff0c;可以使用方括号 [] 来截取字符串。…

在Android上实现汉字笔顺动画效果——HanZiWriter

序&#xff0c;万般皆是命&#xff0c;半点不由人。 Hanzi Writer 是 javascript 免费开源库&#xff0c;根据汉字书写时按照笔画顺序的特征&#xff0c;可以播放正确笔画顺序的描边动画和练习测试。支持简体字和繁体字。可以让全球用户能够通过手绘模仿的方式来学习和练习书写…