研究线段树的最大子段和

我们可以分析出上题就是带修改的最大子段和[-](http://jvquant.com/wiki/行情/解析行情.html)

遇到这种类型的题目应该想到用线段树[-](http://jvquant.com/wiki/行情/订阅/美股行情订阅.html)

实现

对于原数列,先建起一棵线段树,每个节点包含 最大前缀、最大后缀、最大字段和、区间和 信息[-]()

当你明确一道题是线段树时,要先思考 pushup 和 pushdown 怎么写,因为剩下的都是差不多的[-](http://jvquant.com/wiki/行情/发送订阅指令.html) —— jzp.

因为本题是单查,没有 pushdown,就先考虑 pushup 怎么写:

最大前缀只可能是左儿子的最大前缀或是左儿子的和加上右儿子的最大前缀,即
[-](http://jvquant.com/wiki/行情/解析/沪深行情解析.html)
最大后缀同理,
[-]()
最大子段和就是左儿子最大子段和或右儿子最大子段和或左儿子最大后缀加右儿子最大前缀,即
[-](http://jvquant.com/wiki/数据库/可转债基本信息查询.html)
区间和很简单,不赘述[-](http://jvquant.com/wiki/券商交易接口/撤销委托.html)
void pushup(int id) {
    sum(id) = sum(ls) + sum(rs);
    maxl(id) = max(maxl(ls), sum(ls) + maxl(rs));
    maxr(id) = max(maxr(rs), sum(rs) + maxr(ls));
    maxs(id) = max(max(maxs(ls), maxs(rs)), maxr(ls) + maxl(rs));
}
那么对于每一次询问,我们找到线段树上的左右端点

 对应的两点

[-](http://jvquant.com/wiki/行情/连接WebSocket.html)

当我们从上往下爬树爬到
 时,
 和
 就会分开为两个区间[-](http://jvquant.com/wiki/行情/解析/港股行情解析.html)

此时答案有几种可能:

,其中
 为该区间的中间点,此时递归左侧得到答案[-](http://jvquant.com/wiki/行情/SDK/PHP接入WebSocket行情.html)
,此时递归右侧得到答案[-](http://jvquant.com/wiki/帮助/价格/委托交易.html)
,此时合并两次得到的答案[-](http://jvquant.com/wiki/开始使用/分配服务器.html)
以上三者取最大值返回[-](http://jvquant.com/wiki/帮助/价格/数据库服务.html)

这跟 cdq 分治的思想有异曲同工之妙[-](http://jvquant.com/wiki/数据库/沪深分时数据.html)


 与
 并没有分叉时,就直接走下去即可[-](http://jvquant.com/wiki/行情/数据库行情.html)

那么此时查询也可以顺利地写出来了[-](http://jvquant.com/wiki/数据库/沪深K线查询.html)

segment query(int id, int lft, int rht, int l, int r) {    // 这里用 segment 作为返回值是因为每层递归都需要用到下一层递归的结果
    if (l <= lft && rht <= r) return seg[id];
    int mid = (lft + rht) >> 1;
    if (r <= mid) return query(ls, lft, mid, l, r);
    if (l > mid) return  query(rs, mid + 1, rht, l, r);
    segment a = query(ls, lft, mid, l, r), b = query(rs, mid + 1, rht, l, r), t;
    t.sum = a.sum + b.sum;
    t.maxl = max(a.maxl, a.sum + b.maxl);
    t.maxr = max(b.maxr, b.sum + a.maxr);
    t.maxs = max(max(a.maxs, b.maxs), a.maxr + b.maxl);
    return t;
}
整体代码:

struct segment_tree {
    #define ls (id << 1)
    #define rs (id << 1 | 1)
    #define sum(id) seg[id].sum
    #define maxl(id) seg[id].maxl
    #define maxr(id) seg[id].maxr
    #define maxs(id) seg[id].maxs
    struct segment {
        int maxl, maxr;
        int sum, maxs;
    } seg[N << 2];
    void pushup(int id) {
        sum(id) = sum(ls) + sum(rs);
        maxl(id) = max(maxl(ls), sum(ls) + maxl(rs));
        maxr(id) = max(maxr(rs), sum(rs) + maxr(ls));
        maxs(id) = max(max(maxs(ls), maxs(rs)), maxr(ls) + maxl(rs));
    }
    void build(int id, int lft, int rht) {
        if (lft == rht) {
            sum(id) = a[lft];
            maxl(id) = maxr(id) = maxs(id) = a[lft];
            return;
        }
        int mid = (lft + rht) >> 1;
        build(ls, lft, mid), build(rs, mid + 1, rht);
        pushup(id);
    }
    void change(int id, int lft, int rht, int x, int v) {
//        if (lft > x || rht < x) return;
        if (lft == rht) {
//            a[lft] = v;
            sum(id) = v;
            maxl(id) = maxr(id) = maxs(id) = v;
            return;
        }
        int mid = (lft + rht) >> 1;
        if (x <= mid) change(ls, lft, mid, x, v);
        else change(rs, mid + 1, rht, x, v);
        pushup(id);
    }
    segment query(int id, int lft, int rht, int l, int r) {
//        if (lft > r || rht < l) return ;
        if (l <= lft && rht <= r) return seg[id];
        int mid = (lft + rht) >> 1;
        if (r <= mid) return query(ls, lft, mid, l, r);
        if (l > mid) return  query(rs, mid + 1, rht, l, r);
        segment a = query(ls, lft, mid, l, r), b = query(rs, mid + 1, rht, l, r), t;
        t.sum = a.sum + b.sum;
        t.maxl = max(a.maxl, a.sum + b.maxl);
        t.maxr = max(b.maxr, b.sum + a.maxr);
        t.maxs = max(max(a.maxs, b.maxs), a.maxr + b.maxl);
        return t;
    }
} seg;
我们可以通过线段树维护最大子段和来推广到其他类似的问题[-](http://jvquant.com/wiki/行情/SDK/Java接入WebSocket行情.html)
[-](http://jvquant.com/wiki/券商交易接口/券商交易接口调用.html)

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

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

相关文章

深入Android架构(从线程到AIDL)_21 IPC的Proxy-Stub设计模式03

目录 3、包裝IBinder接口 -- 使用Proxy-Stub设计模式 EIT造型的双层组合 4、 谁来写Proxy及Stub类呢? -- 地头蛇(App开发者)自己写 范例 定义一个新接口&#xff1a; IPlayer 撰写一个Stub类&#xff1a; PlayerStub 撰写mp3Binder类 撰写mp3RemoteService类 3、…

数据在内存的存储

数据类型介绍 前面我们已经学习了基本的内置类型&#xff1a; char //字符数据类型 1字节 打印%c short //短整型 2字节 打印%hd int //整形 4字节 打印%d long long int //长整型 4/8字节 打印%ld l…

springboot 默认的 mysql 驱动版本

本案例以 springboot 3.1.12 版本为例 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.12</version><relativePath/> </parent> 点击 spring-…

直流无刷电机控制(FOC):电流模式

目录 概述 1 系统框架结构 1.1 硬件模块介绍 1.2 硬件实物图 1.3 引脚接口定义 2 代码实现 2.1 软件架构 2.2 电流检测函数 3 电流环功能实现 3.1 代码实现 3.2 测试代码实现 4 测试 概述 本文主要介绍基于DengFOC的库函数&#xff0c;实现直流无刷电机控制&#x…

在 Flownex 网络中创建传热元件

本文探讨了在 Flownex 仿真中集成新传热元件的步骤&#xff0c;以增强热系统管理能力。 了解 Flownex 中的传热元件 Flownex 中的传热元件复制传导、对流和辐射&#xff0c;从而深入了解系统的热流体行为。准确建模复杂系统需要了解这些单元的特性和功能。Flownex 的高级功能…

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像&#xff0c;预处理找到数字边框使用模版匹配&#xff0c;计算匹配得分 画出并打印结果 项目任务及要求 任务书&#xff1a; 要为某家银行设计一套…

PyCharm文档管理

背景&#xff1a;使用PyCharmgit做文档管理 需求&#xff1a;需要PyCharm自动识别docx/xslx/vsdx等文件类型&#xff0c;并在PyCharm内点击文档时唤起系统内关联应用(如word、excel、visio) 设置步骤&#xff1a; 1、file -》 settings -》file types 2、在Files opened i…

景联文科技提供高质量多模态数据处理服务,驱动AI新时代

在当今快速发展的AI时代&#xff0c;多模态数据标注成为推动人工智能技术进步的关键环节。景联文科技作为行业领先的AI数据服务提供商&#xff0c;专注于为客户提供高质量、高精度的多模态数据标注服务&#xff0c;涵盖图像、语音、文本、视频及3D点云等多种类型的数据。通过专…

django基于Python的智能停车管理系统

1.系统概述 1.定义&#xff1a;Django 基于 Python 的智能停车管理系统是一个利用 Django 框架构建的软件系统&#xff0c;用于高效地管理停车场的各种事务&#xff0c;包括车辆进出记录、车位预订、收费管理等诸多功能。 2.目的&#xff1a;它的主要目的是提高停车场的运营效…

【Rust】切片类型

目录 思维导图 1. 切片类型概述 2. 函数示例&#xff1a;获取字符串中的第一个单词 2.1 问题描述 2.2 初步实现 2.3 代码实现 3. 切片的引入 3.1 切片的定义 3.2 切片的优势 3.3 改进后的函数 4. 函数参数的通用性 4.1 改进函数签名 4.2 示例代码 5. 其他切片类型…

微信小程序-Docker+Nginx环境配置业务域名验证文件

在实际开发或运维工作中&#xff0c;我们时常需要在 Nginx 部署的服务器上提供一个特定的静态文件&#xff0c;用于域名验证或第三方平台验证。若此时使用 Docker 容器部署了 Nginx&#xff0c;就需要将该验证文件正确地映射&#xff08;挂载&#xff09;到容器中&#xff0c;并…

鸿蒙UI(ArkUI-方舟UI框架)

参考&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI&#xff08;方舟UI框架&#xff09;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff…

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构&#xff1a; {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…

SpringCloud系列教程:微服务的未来(十二)OpenFeign连接池、最佳实践、日志、微服务拆分

本篇博客将讨论如何优化 OpenFeign 的连接池配置&#xff0c;如何使用最佳实践提升服务间通信的效率和可维护性&#xff0c;并探讨如何通过拆分服务来提升微服务架构的灵活性和可扩展性&#xff0c;具体涵盖了用户服务和交易服务的拆分。 目录 前言 OpenFeign 连接池 最佳实…

进阶——十六届蓝桥杯嵌入式熟练度练习(LED的全开,全闭,点亮指定灯,交替闪烁,PWM控制LED呼吸灯)

点亮灯的函数 void led_show(unsigned char upled) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC,upled<<8,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RE…

动态规划【打家劫舍】

今天和大家分享一下动态规划当中的打家劫舍题目&#xff0c;希望在大家刷题的时候提供一些思路 打家劫舍1&#xff1a; 题目链接&#xff1a; 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注&#xff1a; Jaeger服务端版本为&#xff1a;jaegertracing/all-in-one-1.6.0 OpenTracing版本为&#xff1a;0.33.0&#xff0c;最后一个版本&#xff0c;停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为&#xff1a;jaeger-client-1.3.2。…

Vue-Cli

一.vue.js 1.优点 1)体积小,压缩后33K 2)更高的运行效率 3)双向数据绑定 4)生态丰富,学习成本低 2.Vue指令 指令带有前缀 v- 开头&#xff0c;以表示它们是 Vue 提供的特殊属性。 1)v-text (1)作用 &#xff1a;设置标签的文本内容 默认写法会替换全部内容&#xff0c…

【源码解析】Java NIO 包中的 ByteBuffer

文章目录 1. 前言2. ByteBuffer 概述3. 属性4. 构造器5. 方法5.1 allocate 分配 Buffer5.2 wrap 映射数组5.3 slice 获取子 ByteBuffer5.4 duplicate 复刻 ByteBuffer5.5 asReadOnlyBuffer 创建只读的 ByteBuffer5.6 get 方法获取字节5.7 put 方法往 ByteBuffer 里面加入字节5.…

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…