(CDOJ 844 线段树区间最大连续和 )<线段树的各种姿势>

从SPI协议到文件系统:手把手教你用HAL库给W25Q16移植FATFS(附扇区管理优化方案) 本文详细介绍了如何在STM32平台上,通过HAL库的SPI接口为W25Q16 Flash芯片移植FATFS文件系统。文章从SPI通信基础讲起,深入解析了FATFS底层驱动(diskio.c)的移植要点,并重点探讨了针对W25Q16的4KB物理扇区特性进行扇区管理优化的两种方案,旨在帮助开发者构建稳定高效的文件存储方案。 阅读详情

Problem

给定一个序列,每个点有相应权值
有两种操作:
①修改某个点的权值
②查询给定区间的最大连续区间和


Solution

  • 首先要理解清楚题意,是在给定区间内求最大连续子序列。所以暴力的方法很简单,每次在给定区间上贪心地求即可。复杂度O(m∗n)
  • 优化一点可以用线段树
  • 线段树上维护4个值:区间总和s,从左端起的最大连续区间和ls,从右端起的最大连续区间和rs,整个区间最终的最大连续区间和ms。
  • pushup操作

ⅰ ls的修改

可以更新为左子树的ls,或者左子树的s+右子树的ls,分别对应第一条红线和第二条红线

ⅱ rs的修改
同ls的更新一样,可以更新为右子树的rs,或者右子树的s+左子树的ls
目的是保证从端点开始

ⅲ ms的修改
正常的情况是更新为左右子树的max(ms),但是有一种特殊情况:
左子树的rs和右子树的ls是连续的,因此有可能左子树的rs+右子树的ls的值更大
所以一共三种情况

ⅳ s的修改
很简单,把左右子树的s加起来即可
一般来说求最值不需要记录区间和,但这个问题涉及到区间的交并,s可以用于解决完全包含某个子区间的问题(如ls,rs的修改时)

  • query是这个题最难的部分
    ⅰ 同样要维护4个全局变量:区间最大连续子序列anss(即最终答案),从左端点开始的最大连续子序列ansl,从右端点开始的最大连续子序列ansr,已经更新过的区间和sum(同样需要区间和来帮助询问答案)
    ⅱ 线段树一个很重要的性质是:每次更新或者询问一定是先处理左子树,后处理右子树,因此sum维护的是从询问区间最左端到当前区间的区间和,利用sum可以很巧妙的维护其它3个的值
    ⅲ 具体实现的方法
    if(ll<=L&&rr>=R){
        ansl=max(ansl,sum+t[pos].ls);//不更新,或者更新为:左面所有的值的和sum+当前区间的ls,利用线段树更新的顺序是先左后右,可以确保ansl维护的值是从最左端开始的
        anss=max(ansl,anss);
        anss=max(anss,t[pos].ms);
        anss=max(anss,ansr+t[pos].ls);
        ansr=max(ansr+t[pos].s,t[pos].rs);//同样利用sum的性质更新
        anss=max(ansr,anss);
        sum+=t[pos].s;
        return;
    }

ⅳ 最后需要注意的是,ansr的更新必须放在anss之后,因为如果先更新ansr,那么ansr的值有可能会包含当前区间的值,这样会造成重复

Code

// by spli
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;

const int N=500010;
const LL inf=100000000ll;
int n,m;
struct seg{
    int L,R;
    LL s,ms,ls,rs;
}t[N*4+5];
LL ansl=-inf,ansr=-inf,anss=-inf,sum=0;

void pushup(int pos){
    t[pos].s=t[pos<<1].s+t[pos<<1|1].s;
    t[pos].ms=max(t[pos<<1].ms,max(t[pos<<1|1].ms,t[pos<<1].rs+t[pos<<1|1].ls));
    t[pos].ls=max(t[pos<<1].ls,t[pos<<1].s+t[pos<<1|1].ls);
    t[pos].rs=max(t[pos<<1|1].rs,t[pos<<1|1].s+t[pos<<1].rs);
}

void build(int pos,int L,int R){
    t[pos].L=L;
    t[pos].R=R;
    if(L==R){
        scanf("%lld",&t[pos].s);
        t[pos].ms=t[pos].ls=t[pos].rs=t[pos].s;
        return;
    }
    int mid=(L+R)>>1;
    build(pos<<1,L,mid);
    build(pos<<1|1,mid+1,R);
    pushup(pos);
}

void update(int pos,int k,int v){
    int L=t[pos].L;
    int R=t[pos].R;
    if(L==R){
        t[pos]=(seg){L,R,v,v,v,v};
        return;
    }
    int mid=(L+R)>>1;
    if(k<=mid) update(pos<<1,k,v);
    else update(pos<<1|1,k,v);
    pushup(pos);
}

void query(int pos,int ll,int rr){
    int L=t[pos].L;
    int R=t[pos].R;
    if(ll>R||L>rr) return;
    if(ll<=L&&rr>=R){
        ansl=max(ansl,sum+t[pos].ls);
        anss=max(ansl,anss);
        anss=max(anss,t[pos].ms);
        anss=max(anss,ansr+t[pos].ls);
        ansr=max(ansr+t[pos].s,t[pos].rs);
        anss=max(ansr,anss);
        sum+=t[pos].s;
        return;
    }
    int mid=(L+R)>>1;
    query(pos<<1,ll,rr);
    query(pos<<1|1,ll,rr);
}

int main(){
    scanf("%d%d",&n,&m);
    build(1,1,n);
    int k,x,y;
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&k,&x,&y);
        if(k==1){
            anss=ansl=ansr=-inf;sum=0;
            query(1,x,y);
            printf("%lld\n",anss);
        }
        if(k==2) update(1,x,y);
    }
    return 0;
}
基于STM32设计的水质检测系统_333 水质安全对生态环境、农业生产、工业制造以及人类健康至关重要。针对传统水质检测方式检测周期长、成本高、实时性差的问题,本项目设计并实现了一种基于STM32的水质检测系统。系统采用STM32F103RCT6作为主控芯片,集成水温、pH值、电导率和浊度等传感器,能够实时采集水质数据,并通过OLED显示屏进行本地显示。同时,利用Air724UG 4G模块通过MQTT协议将数据上传至华为云IoT平台,实现远程监测。用户可通过Qt5开发的Android手机APP和Windows上位机查看水质数据,并接收超限报警提示。此 阅读详情

相关推荐

Windows 10/11下Drive Composer Pro 2.9.0完整安装与连接ACS880变频器实战教程

本文详细介绍了在Windows 10/11系统上安装Drive Composer Pro 2.9.0并连接ACS880变频器的完整教程。从系统环境准备、软件安装到许可证配置,再到USB、蓝牙和以太网三种连接方式的实战操作,帮助工业自动化工程师快速掌握ABB变频器的调试技巧。

weixin_32956805的博客 527

P4513 小白逛公园(线段树 + 连续区间和最值)

洛谷 P4513 小白逛公园(线段树 + 连续区间和最值)

2301_76575887的博客 1150

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC

视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优

weixin_42591413的博客 671

动态求连续区间和(线段树 树状数组)

如果不是叶子节点,那么先求中点,建左子树(l到mid),建右子树(mid+1到r)1️⃣如果所求区间左节点小于或等于mid,去查询这个左区间的值 ,并加到sum中。2️⃣如果所求区间右节点大于mid,去查询这个右区间的值,并加到sum中。如果是叶子节点,赋值结构体的左区间,右区间,值。向上更新,建树,求区间和,修改节点值。如果目标节点 mid 向右寻找。如果这个区间被覆盖,直接返回值。如果找到节点 直接加上目标值。如果没有被覆盖,求中间节点。最后向上更新pushup。

weixin_74749489的博客 375

ZXDoc工业级CAN总线仿真工具全解析与应用实践

CAN总线作为现代工业通信的核心协议,其仿真技术是汽车电子和工业控制领域的关键支撑。通过物理层信号模拟、协议层报文解析和应用层人机交互的三维仿真,开发者能够构建完整的硬件在环测试环境。ZXDoc作为工业级仿真工具,集成了DBC工程化管理、HMI面板设计和自动化测试脚本等核心功能,特别适用于ECU开发、产线验证等场景。工具支持ISO11898标准协议,提供错误帧注入、负载压力测试等高级特性,结合Python API可实现复杂测试用例的自动化执行。在新能源车VCU测试等实践中,通过优化采样点等参数配置,显著提升

weixin_30096975的博客 471

SAP 更改物料基本计量单位

创建订单单位后,新创建的采购申请、采购合同、采购信息记录均会使用新的订单单位

matinal 當冬夜漸暖 。公众号:matinal 6161

HDU1540——线段树维护连续区间

题目链接:https://vjudge.net/problem/HDU-1540#author=cqbzguomao Description 在抗日战争期间,华北平原广大地区进行了大规模的隧道战。 一般来说,通过隧道连接的村庄排成一列。 除了两端,每个村庄都与两个相邻的村庄直接相连。 入侵者经常对一些村庄发动袭击并摧毁其中的部分隧道。 八路军指挥官要求最新的隧道和村庄连接状态。 如果某些...

mumei的博客 345

自动驾驶关键技术(一):时间敏感网络TSN

时间敏感网络TSN的基本概念、协议族介绍和开发流程。

3080

三种解法求:最大连续子序列的和

示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 一、贪心思想 假设a[l]...a[r]的和为 sum 如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留 如果 sum <0,则说明 sum 对结果无增益效果,需要舍弃 明白了这个道理,那么对于第i个数来说,我们查看他之前的sum,如果sum<0,那么当前的最大连续子序列和就是它本身(舍弃前面的);如果sum&gt...

马小超 1万+

利用dxflib读写cad文件

本篇主要在qt做一个例子读取cad文件数据,使用的开源库是dxflib。用到dxflib的DL_CreationAdapter,DL_Dxf。DL_Dxf是用来读取.dxf文件的类,DL_CreatinAdapter是一个容器,当DL_Dxf加载.dxf文件后,就会响应DL_CreationAdapter这个类,读取cad数据。我们来看看...

weixin_33759269的博客 1984

Python 对接钉钉获取员工上一篇日报或周报内容

摘要:本文介绍使用Python对接钉钉API获取员工日报/周报的方法。首先需创建钉钉应用并开通日志权限,获取员工UserID。通过获取AccessToken进行鉴权,调用topapi/report/list查询日志记录,筛选最新日报/周报后,使用topapi/report/details获取详细内容。需注意权限控制、时间范围筛选和模板匹配等问题。文末提供完整代码示例,并建议扩展自动化触发、数据存储等功能。该方法适用于企业自动化获取员工工作日志的场景。

从技术实践立足,从项目管理方法论延伸思考 808

最大连续区间和算法详解+代码

写在前边 本篇主要记录了最大连续区间和的暴力算法和dp算法(三种写法) 以及讲解了求最大区间和的区间左右下标的方法 ----------------------------------------------------------------------------------- 问题概述 这是一个经典的问题。 给定一个长度为n的序列a[1],a[2]...a[n-1],a[n] ...

1900的博客 8144

拉曼光谱入门:10.显微拉曼与共聚焦技术

本文系统阐述了显微拉曼光谱技术与共聚焦原理的融合机制,详细解析了从激光激发、针孔空间滤波到光谱采集的完整光路架构,阐明了共聚焦设计在提升三维空间分辨率、抑制荧光背景及实现微区无损层析方面的核心优势,并探讨了关键光学器件的性能边界与系统技术局限。

qq_53529450的博客 167

CDOJ 844 线段树区间最大连续和

程序设计竞赛 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) “你动规无力,图论不稳,数据结构松散,贪心迟钝,没一样像样的,就你还想和我同台竞技,做你的美梦!今天这场比赛,就是要让你知道你是多么的无能!!” 不训练,无以为战。有nn项能力是ACM竞赛

qq_38136552的博客 532

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

cdoj844-程序设计竞赛 (线段树的区间最大连续和)【线段树】

http://acm.uestc.edu.cn/#/problem/show/844 程序设计竞赛 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) SubmitStatus “你动规无力,图论不稳,数据结构松散,贪心迟钝,没一样像样的,就你...

weixin_30767921的博客 104

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CDOJ_844 程序设计竞赛

原题地址:http://acm.uestc.edu.cn/#/problem/show/844 “你动规无力,图论不稳,数据结构松散,贪心迟钝,没一样像样的,就你还想和我同台竞技,做你的美梦!今天这场比赛,就是要让你知道你是多么 的无能!!” 不训练,无以为战。有n项能力是ACM竞赛要求的,训练则能提升,忽略则会荒废。 这m天,你能做到如何。 Input 第...

weixin_30622181的博客 99

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

UESTC 844 程序设计竞赛 【维护值稍多的线段树】

【题目大意】 维护一个序列,使之支持一下两种操作: 1、单点修改 2、查询一个区间子区间最大值(在某个区间中任意寻找一段连续子区间,使得该子区间的和最大)(以下将该值称为‘答案’) 【解题思路】 线段树做法: 考虑维护四种和:sum,suml,sumr,subsum,分别是区间和,左端点开始连续最大和(以下将该值称为‘左始和’),右端点结束连续最大和(以下将该值称为‘右结和’),答案

Lannister_Stark的博客 623

待写

线段树 区间合并 CDOJ844  POJ3667 HDU3308 HDU1540

ACUNSTOPPABLE 226

CDOJ 838 母仪天下 树状数组 (2014数据结构专题

母仪天下 Time Limit: 1 Sec  Memory Limit: 162 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/838 Description 富庶的建业城中,有一条格格不入的长街,名曰跳蚤街,被战争所致的孤儿,聚集于此。全国的经济都在为战争服务之时,也无人顾得了这里了。 除了两位夫人。 ...

weixin_34307464的博客 192

最大连续区间和的算法总结

最大连续区间和是一个经典的问题。给定一个长度为n的序列a[1],a[2]...a[n-1],a[n],求一个连续的子序列a[i],a[i+1]...a[j-1],a[j],使得a[i]+a[i+1]...a[j-1]+a[j]最大。①最简单最容易想到的就是根据定义来枚举。枚举上下界{i,j | 0<=i<=j<=n},维护一个max值即可。其中枚举上下界的时间复杂度为O...

weixin_30732825的博客 377

最大连续区间和问题

问题:在数字串中,每次在不重复的数上加0 ~ n个x,每次加x都是独立的,并且求每次最大的子串和。 #include<bits/stdc++.h> #define ll long long using namespace std; const int N = 5005; int f[N][N];//f[i][j]表示以i结尾的、给j个元素添加x后的最大连续数组和 void solve(){ int n,x; cin>>n>>x; for(i

glide的博客 461

线段树之区间最大连续和问题

问题:对于一颗线段树,每次询问[L,R],求此区间中任意一段连续序列,此连续序列和最大。 解法:每个节点维护4个值: max:此区间内的最大连续和 sum:该节点以下的节点值得总和 lmax:此区间的从左端开始的最大连续和 rmax:此区间的从右端开始的最大连续和 合并区间时,该区间的最大连续和为:max(左子节点的最大连续和,右子节点的最大连续和,左子节点的最大右连续...

weixin_30278311的博客 301

hdu3911(线段树区间异或+区间和并+查询最区间大连续1的个数)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意:给定序列(只有0,1),修改是将0变成1,1变成0,询问是查询区间最大连续1的数目。 用线段树维护7个变量: 第1,2个是区间的最大前缀0,和前缀1 第3,4个是区间的最大后缀0,和后缀1 第5,6个是区间的最大连续0,和最大连续1 第7个是lazy(区间更新必备) 由于我们存了...

weixin_30646315的博客 431

E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)

E. Sign on Fence 给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai​≤109,有mmm次询问,每次给定l,r,kl, r, kl,r,k,要我们在[l,r][l, r][l,r]区间内找到一个长度为kkk的区间,使得区间最小值最大,输出最大值。 考虑二分答案,如果当前二分的区间是[l,r][l, r][l,r],我们把大于midmidmid的点,在数组中都设置为111,小于等于midmidmid的点,在数组中都设置为000, 考虑用线段树

lifehappy 669

线段树(以区间和为例)

​ 线段树的根节点是一个长区间,例如输入不超过N个的数,那么可以将根节点设为[1,N],它的左右子节点为均分父节点的两个区间,即左半区间和右半区间1⌊N12⌋⌊N12⌋1N1⌊2N1​⌋][⌊2N1​⌋1N,依次递归地建立,直到叶子节点,即区间ii[i,i]ii。

shiki217_的博客 1694
上一篇: (CF 148D Bag of mice)<简单概率DP>
下一篇: (poj 3667 Hotel)<丧病线段树区间合并>
SDFZspli
博客等级 码龄10年 17粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值