• 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

    # 树状数组模板(维护前缀最大值)
    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的最大值
                
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

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

    # 树状数组模板(维护前缀最大值)
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    go 语言 mage 安装踩坑
    Python笔记二之多线程
    java 阿里云上传照片
    FPGA/数字IC(芯海科技2022)面试题 2(解析版)
    数据结构(C++)- 模拟实现跳表SkipList(Redis内部数据结构),跳表与哈希表,红黑树对比
    小程序商城营销模式怎么去选择?链动2+1举例讲解
    我也来一个“羊了个羊”
    kubernetes快速部署
    Nacos安装指南(Windows环境)
    Python实现基于词汇信息融合的中文NER模型
  • 原文地址:https://blog.csdn.net/weixin_40986490/article/details/134253839