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

news2024/11/25 13:32:36

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

  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]-i
        t = BIT(len(b) + 1)
        ans = -inf
        for i, x in enumerate(nums):
            j = bisect_left(b, x - i) + 1  # nums[i]-i 离散化后的值(从 1 开始)
            f = max(t.pre_max(j), 0) + x
            ans = max(ans, f)
            t.update(j, f)
        return ans

# 树状数组模板(维护前缀最大值)
class BIT:
    def __init__(self, n):
        self.tree = [-inf] * n

    def update(self, i: int, val: int) -> None:
        while i < len(self.tree):
            self.tree[i] = max(self.tree[i], val)
            i += i & -i

    def pre_max(self, i: int) -> int:
        mx = -inf
        while i > 0:
            mx = max(mx, self.tree[i])
            i -= i & -i
        return mx

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

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

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

相关文章

【嵌入式框架】搭建调试输出、建立时间系统

一、Zorb简介 Zorb Framework是一个基于面向对象的思想来搭建一个轻量级的嵌入式框架。 搭建Zorb Framework的目的是为在不能运行Linux的芯片上快速开发应用&#xff0c;不用反复造轮子。 Zorb Framework的初步设计功能有&#xff1a; 1、时间系统功能zf_time 2、环形缓冲…

微信小程序获取openid

1.需要小程序中调用 wx.login获取临时code值&#xff08;每次获取的code值只能用一次&#xff09; wx.login({success (res) {console.log(res)} }) 打印结果为&#xff1a; 2.调用微信提供的apid接口&#xff0c;获取openid&#xff0c;入参需要三个参数&#xff1a;AppID(小…

SPSS单因素方差分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

Python 用户输入和字符串格式化指南

Python 允许用户输入数据。这意味着我们可以向用户询问输入。在 Python 3.6 中&#xff0c;使用 input() 方法来获取用户输入。在 Python 2.7 中&#xff0c;使用 raw_input() 方法来获取用户输入。以下示例要求用户输入用户名&#xff0c;并在输入用户名后将其打印在屏幕上&am…

Prometheus接入AlterManager配置企业微信告警(基于K8S环境部署)

文章目录 一、创建企业微信机器人二、配置AlterManager告警发送至企业微信三、Prometheus接入AlterManager配置四、部署PrometheusAlterManager(放到一个Pod中)五、测试告警 注意&#xff1a;请基于 PrometheusGrafana监控K8S集群(基于K8S环境部署)文章之上做本次实验。 一、创…

IDEA快捷键总结+常识积累

&#xff08;一&#xff09;常用快捷键总结 以下快捷键输入完成后按Tab键即可。 1、输入main public static void main(String[] args) {}2、输入sout System.out.println();3、输入fori for (int i 0; i < ; i) {}4、输入foreach&#xff08;增强for循环快捷键&#x…

CMake引用QT、CMake构建一个转换为3d tile的开源代码

在CMake里单独运行一下 find_package(Qt5 REQUIRED COMPONENTS Core Xml Test) ,Core Xml Test 这三个是需要的qt组件; 情况如下;提示找不到QT; 根据资料,cmake引用qt需要3-4个方面, 首先Qt包含三个编译工具:moc、uic、rcc, moc:元对象编译器(Meta O…

翻页电子杂志制作功略,快收藏,保管好用!

翻页电子杂志&#xff0c;我相信这对大家很熟悉吧&#xff0c;大家也都经常看电子杂志吧。它和我们的生活紧密相关&#xff0c;也极大地改变了我们的阅读方式。听到这“翻页电子杂志”&#xff0c;是不是觉得制作起来肯定很难很复杂&#xff0c;需要专业的人才能制作呢&#xf…

2023 年最值得推荐的 10 款 iPhone 数据恢复软件

iPhone 从来都不是一个简单的打电话电话。它就像一台微型电脑&#xff0c;让我们互相联系、拍照、拍视频、发邮件、看文档、看书。然而&#xff0c;随着它成为日常生活的必需品&#xff0c;我们总是容易因各种原因丢失数据&#xff0c;如删除、恢复出厂设置、iOS 错误、文件同步…

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数&#xff0c;通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布&#xff0c;表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

从功能测试到测试开发,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…

【Spring Security】Spring Security 认证与授权

在前面的章节中,我们沿用了Spring Security默认的安全机制:仅有一个用户,仅有一种角色。在实际开发中,这自然是无法满足需求的。本章将更加深入地对Spring Security迚行配置,且初步使用授权机制。 3.1 默认数据库模型的认证与授权 3.1.1、资源准备 首先,在controller包…

Linux文件共享的完美助手:深入探索Samba和NFS

1 samba介绍 1.1 samba基本介绍 作用&#xff1a;网络文件共享 smb&#xff08;Server Message Block &#xff09;是 Miscrosoft公司软件。 cifs &#xff08; Common Internet File System &#xff09;是Sum公司开发&#xff0c;是smb的开源版。 1.2 samba基本信息 服务启…

全球首例无液氦脑磁图辅助下的胶质瘤切除手术顺利完成

近日&#xff0c;在国家重点研发计划“新型无液氦脑磁图系统研发”项目支持下&#xff0c;首都医科大学附属北京天坛医院季楠教授团队完成全球首例无液氦脑磁图运动功能区定位辅助下的胶质瘤切除手术。 手术对一例肿瘤累及运动功能区的年轻女性在术前分别利用无液氦脑磁图仪和功…

使用Gradle创建SpringBoot项目

Spring Boot Gradle 插件在Gradle 提供Spring Boot 支持。它允许您打包可执行jar 或war 归档文件&#xff0c;运行SpringBoot 应用程序&#xff0c;并使用Spring-Boot-dependencies 提供的依赖管理。相关文档请参考&#xff1a; https://docs.spring.io/spring-boot/docs/curre…

【算法挨揍日记】day19——62. 不同路径、63. 不同路径 II

62. 不同路径 62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#x…

2023年【熔化焊接与热切割】免费试题及熔化焊接与热切割考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割免费试题参考答案及熔化焊接与热切割考试试题解析是安全生产模拟考试一点通题库老师及熔化焊接与热切割操作证已考过的学员汇总&#xff0c;相对有效帮助熔化焊接与热切割考试总结学员顺利通过考试。…

小熊猫c++ 搭配keil

小熊猫c 搭配keil 除了vs codekeil插件外&#xff0c;用国产的小熊猫C也可以写keil代码&#xff0c; 两者区别在于vs code多一个有编译功能&#xff0c;而小熊猫C的相对vscode方式&#xff0c;需要多了一个手动切换到keil进行编译步骤。 目的&#xff1a;小熊猫C可以 【代码提…

【MATLAB】基于灰狼优化算法优化BP神经网络 (GWO-BP)的数据回归预测

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 【MATLAB】基于灰狼优化算法优化BP神经网络 (GWO-BP)的数据回归预测 在MATLAB中,基于灰狼优化算法优化BP神经网络(GWO-BP)进行数据回归预测的步骤如下: 数据准备:首先,将用于回归预…

如何保障企业TikTok直播网络的可靠性?

在这个直播流量爆炸的时代&#xff0c;直播带货的营销方式逐渐走向大众&#xff0c;企业通过直播的方式向消费者展示产品和服务&#xff0c;从而提高品牌知名度。而TikTok作为全球最受欢迎的短视频和直播社交平台&#xff0c;拥有庞大且活跃的用户群体&#xff0c;是不少企业直…