【数学归纳法】【位运算】【异或】3068最大节点价值之和

server/2024/9/20 4:02:55/ 标签: 算法, c++, 力扣, 数学归纳法, 位运算, 异或, 最大

本文涉及知识点

数学归纳法 位运算 异或

LeetCode3068. 最大节点价值之和

给你一棵 n 个节点的 无向 树,节点从 0 到 n - 1 编号。树以长度为 n - 1 下标从 0 开始的二维整数数组 edges 的形式给你,其中 edges[i] = [ui, vi] 表示树中节点 ui 和 vi 之间有一条边。同时给你一个 正 整数 k 和一个长度为 n 下标从 0 开始的 非负 整数数组 nums ,其中 nums[i] 表示节点 i 的 价值 。
Alice 想 最大化 树中所有节点价值之和。为了实现这一目标,Alice 可以执行以下操作 任意 次(包括 0 次):
选择连接节点 u 和 v 的边 [u, v] ,并将它们的值更新为:
nums[u] = nums[u] XOR k
nums[v] = nums[v] XOR k
请你返回 Alice 通过执行以上操作 任意次 后,可以得到所有节点 价值之和 的 最大值 。
示例 1:输入:nums = [1,2,1], k = 3, edges = [[0,1],[0,2]]
输出:6
解释:Alice 可以通过一次操作得到最大价值和 6 :

  • 选择边 [0,2] 。nums[0] 和 nums[2] 都变为:1 XOR 3 = 2 ,数组 nums 变为:[1,2,1] -> [2,2,2] 。
    所有节点价值之和为 2 + 2 + 2 = 6 。
    6 是可以得到最大的价值之和。
    示例 2:

在这里插入图片描述

输入:nums = [2,3], k = 7, edges = [[0,1]]
输出:9
解释:Alice 可以通过一次操作得到最大和 9 :

  • 选择边 [0,1] 。nums[0] 变为:2 XOR 7 = 5 ,nums[1] 变为:3 XOR 7 = 4 ,数组 nums 变为:[2,3] -> [5,4] 。
    所有节点价值之和为 5 + 4 = 9 。
    9 是可以得到最大的价值之和。
    示例 3:

在这里插入图片描述

输入:nums = [7,7,7,7,7,7], k = 3, edges = [[0,1],[0,2],[0,3],[0,4],[0,5]]
输出:42
解释:Alice 不需要执行任何操作,就可以得到最大价值之和 42 。

在这里插入图片描述

提示:

2 <= n == nums.length <= 2 * 104
1 <= k <= 109
0 <= nums[i] <= 109
edges.length == n - 1
edges[i].length == 2
0 <= edges[i][0], edges[i][1] <= n - 1
输入保证 edges 构成一棵合法的树。

位运算

x ⊕ k ⊕ k 的值是 x ,故对同一个节点操作 k 次后,结果不边。 x\oplus k \oplus k 的值是x,故对同一个节点操作k次后,结果不边。 xkk的值是x,故对同一个节点操作k次后,结果不边。

图论

树说明是连通的。树是无向连通无环图。

数学归纳法

一,节点a和b直接相连,根据题意,可以nums[a]和nums[b]分别 ⊕ \oplus k。
二,节点a b 通过p条变相连,a 和c通过p+1条边相连,且最后一条边是bc。如果能nums[a]和nums[b]分别 ⊕ \oplus k,其它节点不变。则可以nums[a]和nums[c] ⊕ \oplus k,中间的节点不变。
分两步:
操作(a,b) 操作(b,c) ,由于nums[b] ⊕ \oplus k 两次,其值不变。
也就是 任意连通的节点都可以 ⊕ \oplus k,而不影响其它节点。

记录个节点 ⊕ \oplus k 的变化,如果变大的数量是偶数,全部变大;如果奇数,两种选择:
a,除最小的外,全部变大。
b,最小的减少最少的结合,余下的两两结合。

代码

class Solution {
public:long long maximumValueSum(vector<int>& nums, int k, vector<vector<int>>& edges) {vector<int> vAdd;for (const auto& n : nums) {vAdd.emplace_back((n ^ k) - n);}sort(vAdd.begin(), vAdd.end());long long llRet = std::accumulate(nums.begin(), nums.end(), 0LL);int index = std::upper_bound(vAdd.begin(), vAdd.end(), 0) - vAdd.begin();if (1 & (vAdd.size()-index)) {if ((index) && (vAdd[index] + vAdd[index - 1] >= 0)) {index--;}else {index++;}}llRet += std::accumulate(vAdd.begin()+ index, vAdd.end(), 0LL);return  llRet;}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{vector<int> nums;int k;vector<vector<int>> edges;{Solution sln;nums = { 1, 2, 1 }, k = 3;auto res = sln.maximumValueSum(nums, k,edges);Assert(6LL, res);}{Solution sln;nums = { 2,3 }, k = 7;auto res = sln.maximumValueSum(nums, k, edges);Assert(9LL, res);}{Solution sln;nums = { 7,7,7,7,7,7 }, k = 3;auto res = sln.maximumValueSum(nums, k, edges);Assert(42LL, res);}
}

2024年3月版

class Solution {
public:long long maximumValueSum(vector<int>& nums, int k, vector<vector<int>>& edges) {vector<int> v;for (const auto& n : nums){v.emplace_back((n ^ k) - n);}long long llRet = std::accumulate(nums.begin(), nums.end(), 0LL);sort(v.begin(), v.end());while (v.size() >= 2){long long cur = v.back() + v[v.size() - 2];if (cur <= 0){break;}llRet += cur;v.pop_back();v.pop_back();}return llRet;}
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.ppmy.cn/server/2852.html

相关文章

基于Java+SpringBoot+Vue前后端分离仓库管理系统

基于JavaSpringBootVue前后端分离仓库管理系统 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

Vue 3 项目构建与效率提升:vite-plugin-vue-setup-extend 插件应用指南

一、Vue3项目创建 前提是已安装Node.js&#xff08;点击跳转Node官网&#xff09; npm create vuelatest这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示&#xff1a; ✔ Projec…

FFmpeg: 自实现ijkplayer播放器--07解复用线程设计

文章目录 解复用解复用线程线程调用数据包队列类型定义数据包队列api实现解复用 解复用,读取视频文件,生成数据包(packet),同时,实现数据包队列,存储数据包,用来解码生成数据帧(frame) 解复用线程 read_thread: 创建上下文结构体: avformat_alloc_context打开文件…

Singleton单例设计模式详解

目录 模式定义应用场景实现方式1.懒汉模式&#xff1a;2.饿汉模式&#xff1a;3.静态内部类反射如何防止反射攻击破坏&#xff1f; 枚举类型序列化 部分源码中的应用定位Spring & JDKTomcat反序列化指定数据源 模式定义 保证一个类只有一个实例&#xff0c;并且提供一个全…

利用selenium发挥vip残存的价值

历史版本谷歌浏览器驱动下载地址 https://chromedriver.storage.googleapis.com/index.html 找到与你电脑当前谷歌浏览器版本一致的驱动然后下载下来(大版本一致即可)。我本地版本是 99.0.04844.51 我这里把 chromedriver 放到 /usr/local/bin 下面了。 启动测试窗口 这里需要…

基于STM32F103单片机的时间同步项目

一、前言 本项目为前一个时间同步项目的更迭版本&#xff0c;由于之前的G031开发板没有外部晶振&#xff0c;从机守时能力几乎没有&#xff0c;5秒以上不同步从机时间就开始飞了。在考虑成本选型后&#xff0c;选择了带有外部有缘晶振的STM32F103C8T6最小单片机&#xff0c;来作…

OSPF动态路由实验(华为)

思科设备参考&#xff1a;OSPF动态路由实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过…

[尚硅谷flink] 检查点笔记

在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1&#xff09;周期性的触发保存2&#xff09;保存的时间点3&#xff09;保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

鸢尾花数据集的KNN探索与乳腺癌决策树洞察

鸢尾花数据集的KNN探索与乳腺癌决策树洞察 今天博主做了这个KNN和决策树的实验。 一.数据集介绍 介绍一下数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff1a; 威斯康星州乳腺癌数据集&#xff08;Wisconsin Breast Cancer Dataset&#xff09;是一个经典的机器学习数…

Jackson 2.x 系列【24】Spring Web 集成

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. Spring Web3. Jackson2ObjectMapperBuilder4. Jackson2ObjectMapperFa…

Adobe Premiere Pro将加入AI生成式功能,以提高视频编辑的效率;OpenAI宣布在东京设立亚洲首个办事处

&#x1f989; AI新闻 &#x1f680; Adobe Premiere Pro将加入AI生成式功能&#xff0c;以提高视频编辑的效率 摘要&#xff1a;Adobe宣布&#xff0c;将为Premiere Pro引入由生成式AI驱动的新功能&#xff0c;以提高视频编辑的效率。这些功能包括“生成扩展”&#xff0c;能…

Mongodb入门--头歌实验MongoDB 实验——数据备份和恢复

在实际的应用场景中&#xff0c;经常需要对业务数据进行备份以做容灾准备&#xff0c; MongoDB 提供了备份和恢复的功能&#xff0c;分别是 MongoDB 下的 一、数据备份 任务描述 本关任务&#xff1a;按照编程要求备份数据库。 相关知识 为了完成本关任务&#xff0c;你需要掌…

Nginx 负载均衡配置

负载均衡算法 1. 轮询 权重 &#xff08;最为合理&#xff0c;常用&#xff09; 2. ip_hash / n取模&#xff08;n 节点个数&#xff09; &#xff08;移动端会因为网络&#xff0c;基站的变动&#xff0c;ip会变动。生产不推荐不用&#xff09; 3. 最少访问 &#xff08;记…

梯度下降法法实现线性回归模型

一、线性回归模型 线性回归模型是一种预测性的建模技术&#xff0c;它研究的是因变量&#xff08;目标&#xff09;和自变量&#xff08;特征&#xff09;之间的关系。这种关系假设是线性的&#xff0c;意味着因变量可以通过一个或多个自变量的线性组合来预测。数学上&#xf…

解决reactNative在Android中运行找不到模拟器

排查了半天&#xff0c;发现是环境配置错了 react native是根据一个叫ANDROID_HOME的环境变量寻找的&#xff0c;这个环境变量指向到sdk目录 重新排查的时候发现这个地址配置错了

【随笔】Git 高级篇 -- 获取远程分支数据 git fetch(二十七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

Java面试 Day03

接口和抽象类有什么区别static和final有什么区别JVM加载类如何索引优化MySQL采用什么结构存储索引 为什么搜索算法有了解吗线程同步的几个方案&#xff0c;以及原理final关键词JVM调优&#xff0c;OOM经历隔离级别&#xff0c;InnoDB中几个隔离级别的原理Linux常用命令Redis可靠…

将闲置的windows硬盘通过smb共享的方式提供给mac作为时间机器备份

1.windows端&#xff0c;开启smb共享 自行解决 2.mac端 磁盘工具-文件-新建映像-空白映像 假设你的名字为&#xff1a;backup 大小&#xff1a;350GB&#xff08;自己修改&#xff09; 格式&#xff1a;MacOS扩展&#xff08;日志式&#xff09; 分区&#xff1a;单个分区-A…

【技术支持】禁止html中referer

如果页面中包含了如下 meta 标签&#xff0c;所有从当前页面中发起的请求将不会携带 referer&#xff1a; <meta name"referrer" content"never"> 如果页面中包含了如下 meta 标签&#xff0c;则从当前页面中发起的 http请求将只携带 origin 部分&a…

客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题

客户端传日期格式字段&#xff08;string&#xff09;,服务端接口使用java.util.Date类型接收报错问题 问题演示第1种&#xff1a;客户端以URL拼接的方式传值第2种&#xff1a;客户端以body中的form-data方式提交第3种 客户端以Body中的json方式提交 问题解决&#xff08;全局解…