leetcode:2926. 平衡子序列的最大和 【树状数组维护最大前缀和】

题目链接

lc2926

题目描述

题目思路

定义b[i] = nums[i] - i

目标是从b中找到一个非降子序列使得元素和最大

b[i] = nums[i] - i

找到b的一个非降子序列使得元素和最大

f[i]: 子序列最后一个数下标是i,对应的最大子序列

f[i] = max (max f[j], 0) + nums[i] (j < i and b[j] <= b[i])

也就是维护f[j]的前缀最大值

10 ** 9: 离散化处理 + 重新标序号

ac code

python 复制代码
# 树状数组模板(维护前缀最大值)
class BIT:
    def __init__(self, n: int):
        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


class Solution:
    def maxBalancedSubsequenceSum(self, nums: List[int]) -> int:
        n = len(nums)
        # b[i] = nums[i] - i
        # 找到b的一个非降子序列使得元素和最大
        # f[i]: 子序列最后一个数下标是i,对应的最大子序列
        # f[i] = max (max f[j], 0) + nums[i] (j < i and b[j] <= b[i])
        # 也就是维护f[j]的前缀最大值
        # 10 ** 9: 离散化处理 + 重新标序号
        b = sorted(set(x - i for i, x in enumerate(nums)))
        t = BIT(len(b) + 1) # 经典初始化
        for i, x in enumerate(nums):
            j = bisect_left(b, x - i) + 1 # 找到b[i]离散化后的位置
            f = max(t.pre_max(j), 0) + x # 计算f[i]
            t.update(j, f)
        return t.pre_max(len(b)) # 所有f的最大值
            

树状数组维护前缀最大值模版

python 复制代码
# 树状数组模板(维护前缀最大值)
class BIT:
    def __init__(self, n: int):
        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
相关推荐
LeetCode天天刷3 分钟前
【软件认证】比特翻转【滑动窗口】
算法
源代码•宸6 分钟前
Leetcode—1123. 最深叶节点的最近公共祖先【中等】
经验分享·算法·leetcode·职场和发展·golang·dfs
s砚山s9 分钟前
代码随想录刷题——二叉树篇(十三)
数据结构·算法
alphaTao13 分钟前
LeetCode 每日一题 2026/1/5-2026/1/11
算法·leetcode
山上三树14 分钟前
详细介绍 C 语言中的 #define 宏定义
c语言·开发语言·算法
黎雁·泠崖29 分钟前
二叉树知识体系全梳理:从基础到进阶一站式通关
c语言·数据结构·leetcode
AI科技星30 分钟前
引力与电磁的动力学耦合:变化磁场产生引力场与电场方程的第一性原理推导、验证与统一性意义
服务器·人工智能·科技·线性代数·算法·机器学习·生活
蜕变菜鸟32 分钟前
JS的Object.keys()和sort()排序的用法
数据结构·算法
源代码•宸33 分钟前
Golang基础语法(go语言error、go语言defer、go语言异常捕获、依赖管理、Go Modules命令)
开发语言·数据库·后端·算法·golang·defer·recover
如果你想拥有什么先让自己配得上拥有43 分钟前
算数顺序的逻辑和发展?
算法