第 370 周赛 100112. 平衡子序列的最大和(困难,离散化,权值树状数组)

在这里插入图片描述
太难了,看答案理解了半天

  1. 题目的要求可以理解为 nums[ij] - ij >= nums[ii] - ii ,所以问题化为求序列 bi = nums[i] - i 的非递减子序列的最大元素和
  2. 需要前置知识,离散化,树状数组
  3. 离散化:将分布大却数量少(即稀疏)的数据进行集中化的处理,减少空间复杂度,也就是不关心元素的实际值,只关心元素的大小关系。具体过程就是将原数组排序,以排序后的下标作为原数组的值的”新值“
  4. 树状数组就是利用lowbit(最右边的 1 的值 10010 的 lowbit 就是 10)的性质,把n个节点串起来,隐式地构造一棵树(当n不是2幂次时,是一个森林)。每个节点x的父亲是x + lowbit(x),每个节点维护其子节点的和。
  5. 最重要的一点,也是树状数组算法的核心,即处于当前x节点左边不在x子树中最大的节点是x - lowbit(x)
  6. 在本题中数组 tree[i] 表示序列末尾为 i 及其它的子节点 的非递减子序列的最大元素和,例如 tree[6] 就表示以5或6结尾的非递减子序列的最大元素和
  7. 所以只需要遍历 nums,遍历至 nums[i] 时,通过 b[i] 知道 nums[i] 在整个数组中排第几,也就是 nums[i] 将插入树状数组 tree 的哪个位置,举例来说,如果 nums[i] 对应的离散化值为 6,通过 那么它可以加入任何以 1,2,…,6 为结尾的非递减子序列,也就 tree[6] 应该更新为 max(tree[j]) + nums[i](j = 1,2,…,6),而通过第5点我们可以在 O(logn) 的时间复杂度内求出 max(tree[j]),在求得新的 tree[6] 之后还需要更新维护树状数组,即要更新 tree[6] 的所有祖先节点,在这里只有 8
    在这里插入图片描述
class Solution:def maxBalancedSubsequenceSum(self, nums: List[int]) -> int:b = sorted(set(x - i for i, x in enumerate(nums)))  # 离散化 nums[i]-it = BIT(len(b) + 1)ans = -inffor i, x in enumerate(nums):j = bisect_left(b, x - i) + 1  # nums[i]-i 离散化后的值(从 1 开始)f = max(t.pre_max(j), 0) + xans = max(ans, f)t.update(j, f)return ans# 树状数组模板(维护前缀最大值)
class BIT:def __init__(self, n):self.tree = [-inf] * ndef update(self, i: int, val: int) -> None:while i < len(self.tree):self.tree[i] = max(self.tree[i], val)i += i & -idef pre_max(self, i: int) -> int:mx = -infwhile i > 0:mx = max(mx, self.tree[i])i -= i & -ireturn mx

代码来自https://leetcode.cn/circle/discuss/KvdrY9/view/ZoYRRe/,作者:灵茶山艾府

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

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

相关文章

0X02

web9 阐释一波密码&#xff0c;依然没有什么 发现&#xff0c;要不扫一下&#xff0c;或者看一看可不可以去爆破密码 就先扫了看看&#xff0c;发现robots.txt 访问看看,出现不允许被访问的目录 还是继续尝试访问看看 就可以下载源码&#xff0c;看看源码 <?php $fl…

旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用

引言&#xff1a; VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验&#xff0c;还为景区旅游文化注入了新的生机。 一&#xff0e;VR全景技术&#xff1a;革新旅游体验 1.什么是VR全景技术&#xff1f; VR全景技术是一种虚拟现实技术&am…

第12章_MySQL数据类型精讲

文章目录 1 MySQL中的数据类型2 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4 如何选择演示代码 3 浮点类型3.1 类型介绍 本章的内容测试建议使用 MySQL5.7进行测试。3.2 数据精度说明3.3 精度误差说明 4 定点数类型4.1 类型介绍4.2 …

ZZ038 物联网应用与服务赛题第D套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (D卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的各类软件工具、软件安装文件等,都…

1、Flink基础概念

1、基础知识 &#xff08;1&#xff09;、数据流上的有状态计算 &#xff08;2&#xff09;、框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 &#xff08;3&#xff09;、事件驱动型应用&#xff0c;有数据流就进行处理&#xff0c;无数据流就不…

Android MVI架构的深入解析与对比

什么是MVI&#xff1f; M&#xff1a;model&#xff0c;此处的model并不是传统的数据模块&#xff0c;它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。 V&#xff1a;view&#xff0c;视图模块 I&#xff1a;…

MongoDB设置密码

关于为什么要设置密码 公司的测试服务器MongoDB服务对外网开放的&#xff0c;结果这几天发现数据库被每天晚上被人清空的了&#xff0c;还新建了个数据库&#xff0c;说是要支付比特币。查了日志看到有个境外的IP登录且删除了所有的集合。所以为了安全起见&#xff0c;我们给m…

【JVM系列】- 挖掘·JVM堆内存结构

挖掘JVM堆内存结构 文章目录 挖掘JVM堆内存结构堆的核心概念堆的特点 堆的内存结构内存划分新生代/新生区&#xff08;Young Generation&#xff09;老年代&#xff08;Tenured Generation&#xff09;永久代&#xff08;或元数据区&#xff09;&#xff08;PermGen 或 MetaSpa…

【蓝桥杯 第十四届省赛Java B组】真题训练(A - C)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - A、阶乘求和 - BigInteger 思路&#xff1a; 当时比赛时&#xff0c;拿计算器算的&#xff0c;然后辛辛苦苦也没对 看到这个数肯定很大&#xff0c;而且只求后9位&#xff0c;阶乘越…

【原创】java+swing+mysql校园共享单车管理系统设计与实现

摘要&#xff1a; 校园共享单车作为一种绿色、便捷的出行方式&#xff0c;在校园内得到了广泛的应用。然而&#xff0c;随着单车数量的增加&#xff0c;管理难度也不断加大。如何提高单车的利用率和管理效率&#xff0c;成为校园共享单车发展面临的重要问题。本文针对这一问题…

php7.4.32如何快速正确的开启OpenSSL扩展库,最简单的办法在这里!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

微服务架构——笔记(2)

微服务架构——笔记&#xff08;2&#xff09; 一、客户客户端模块 文章来源B站视频 尚硅谷SpringCloud框架开发教程(SpringCloudAlibaba微服务分布式架构丨Spring Cloud)教程 本次笔记内容为消费者订单Module模块 1.1 项目名称、目录结构 1.2 Pom.xml <?xml version&q…