线段树总结一

线段树专题(一) Acmer可怜啊,根本没有休息,昨天才刚刚完成了矩阵专题,今天又要开线段树专题了。唉,等我以后月薪15K的时候,我要好好享受人生。。。。。。呃,扯远了。线段树是一个非常重要的数据结构,以前就学习过,但是没有系统的刷过难题,这次我决定将kuangbin先生的专题和NotOnlySuccess大神的专题一起刷掉。因为题目多又难,所以分成几个部分(最多三个把)。 对于线段树的话 阅读详情

先看一个例子:给出一个数组a[ n ],提供两种操作:1、修改其中任意一个数字。2、给出一个下标区间[ i , j ],得出a[ ]中该下标区间数字之和。

按照最朴素的想法做,修改数字可以在O(1)的复杂度下实现,操作2用循环从i到j求和,若有m次操作2,则复杂度为O(mn),那么这样的一个算法最终复杂度实为O(n^2),这样的复杂度下能处理的数据规模就比较有限。而采用线段树这样一种数据结构就能将这类区间问题的复杂度降低到O(nlogn),实现一个极大的优化。


建树的方式不唯一,下面为根据上述问题建的一颗线段树(大小可变)。



这个问题的建树原则:根节点是要处理的数据区间段,左儿子是父亲节点的左半部分,右儿子则是右半部分,直至节点为”一个点”。

查询或修改某个节点的复杂度都为O(logn),题目中每个节点保存该节点所示区间之和,在更新了某个点的数据后向上回溯更新父亲节点的数据。

节点定义成这样:

struct node  
{  
    int l,r;  //该节点表示区间为[l,r]
    int sum; //数据域 
}t[MAXN*4];

其中数据域根据需求不同而不同



先构造并初始化一颗线段树

void construct(int l,int r,int p)  //所需建树的区间[l,r]
{
    t[p].l=l,t[p].r=r,t[p].sum=0;
    if(l==r)
    {
        scanf("%d",&t[p].sum);
        return ;
    }//递归至“一个点”时输入该点的值
    int m=(l+r)>>1;
    construct(l,m,p*2);  //建左子树
    construct(m+1,r,p*2+1);  //建右子树
    
    t[p].sum=t[p*2].sum+t[p*2+1].sum;//向上回溯更新父节点
}



修改操作

void modify(int x,int p,int val)//将a[ ]中下标为x的数改为val
{  
    if(t[p].l==t[p].r)  
    {  
        t[p].sum=val;  
        return ;  
    }  
    int m=(t[p].l+t[p].r)>>1;  
    if(x<=m) modify(x,p*2,val); //小于中间值则在左子树找 
    else modify(x,p*2+1,val);  //否则在右子树找
    t[p].s=t[p*2].sum+t[p*2+1].sum; //向上回溯更新父节点 
}  

查询操作

int query(int l,int r,int p)  //查询区间[l,r]之和
{  
    if(t[p].l==l&&t[p].r==r)  
        return t[p].sum;  
    int m=(t[p].l+t[p].r)>>1;  
    if(r<=m) return query(l,r,p*2);//[l,r]全在左子树  
    if(l>m) return query(l,r,p*2+1);  //[l,r]全在右子树
    else return query(l,m,p*2)+query(m+1,r,p*2+1);  //左右子树各有一部分
}  

至此,这道题便基本解决了,这种类型的题属于点更新段/点查询,属于最简单的线段树运用了,查询一个区间内的最大/最小值等也类似此做法,在回溯更新等处稍作变化就行。

那成段更新呢?这涉及到Lazy思想也就是延迟更新,我会在以后有空的时候再写写,还有区间合并、扫描线等。

线段树是种容易上手又非常优雅的数据结构,有很多优点,即便有时只是最简单的线段树操作,但是修改顺序查询方式不一样又会让人耳目一新!

本blog中有几篇线段树的结题报告,欢迎查看。

5分钟搞懂超分算法:从插值到深度学习的实战对比(附Python代码) 本文系统对比了从传统插值到深度学习的主流超分算法,包括最近邻、双线性、双三次插值,以及基于边缘、统计模型和SRCNN、ESPCN、SRGAN等深度学习模型。通过实战代码和决策框架,帮助开发者根据图像质量、速度、资源等需求,快速选择最合适的超分辨率算法,实现从低清到高清的有效转换。 阅读详情

相关推荐

二手分析仪器改造实战:如何用PMT搭建荧光检测电路(附完整电路图)

本文详细介绍了如何利用二手分析仪器中的光电倍增管(PMT)核心部件,进行荧光检测电路的实战改造。内容涵盖从PMT工作原理理解、高压供电电路设计、低噪声前置放大(跨阻放大器)到信号调理的完整流程,并提供了关键电路图与调试排错指南,旨在帮助电子爱好者与工程师低成本构建稳定、高灵敏度的专业检测系统。

weixin_29234239的博客 440

编程实践|用 MoonBit 实现线段树(一)

Nil其中Nil代表空树,而一个Node则包含一个它所储存的数据(为 Int 类型)和左右两个节点。此外,我们还为他 derive 了 Show Trait,我们在遇到问题时可以直接输出这棵树来调试,这样非常直观且方便。尝试实现一个可以维护多个信息(如区间和、区间最大值最小值)的线段树。自行了解如何实现线段树的单点查询/修改操作并实现。自行了解线段树的区间修改操作以及 LazyTag 的相关知识。

m0_74743788的博客 1368

毫米波雷达之CFAR 目标检测

恒虚警率(CFAR)算法是一种广泛应用于雷达目标检测的算法,其主要目 标是减少由于杂波与回波之间强度不对称而引起的误报,以确保相对恒定的虚警 率。如图 3.4(a)所示,表示由距离单元组成的一维数据。在待测单元 D 周围选 择若干个背景杂波功率的蓝色单元构成参考滑窗,称为参考单元;而待测单元 D 相邻的若干个不用于背景估计的单元则称为保护单元。当参考单元和保护单元的 维度从一维扩展到二维时,相应的 CFAR 检测由一维 CFAR 演变为二维 CFAR 以处理参考窗口,如图 3.4 (b)所示。

m0_56120826的博客 4920

[离散化]线段树练习一

线段树练习题一线段树练习题一线段树练习题一 题目描述 桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少? 样例输入 20 //桌面总宽度 4 //盒子数量 1 5 3 8 7 10 13 19 样例输出 15 数据范围 1<=n<=100000,1<=m<=100000,保证坐标范围为[1,n]. code #include<stdio.h> #include

SSL_LJH的博客 217

UG/NX二次开发Siemens官方NXOPEN实例解析—1.3 BlockStyler/ExtrudewithPreview

随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。

MarcoPro的博客 1632

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1758

线段树(一):基本概念

线段树(一):基本概念

主要研究图形学相关领域 263

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程BACnet MS/TP BACnet IP调试说明

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程mstp,bacnet ip调试说明

shufawangzhang的博客 2222

『RMQ』解决RMQ问题的方法(一)—— 线段树

RMQ (Range Minimum/MaximumQuery):     对于长度为n的数组A,回答若干询问RMQ(A,i,j)(i,j<=n-1),返回数组A中下标在i,j范围内的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。 线段树是蒟蒻最先学的维护区间性质的数据结构,对于很多新手来说是很好的选择。写起来可以递归,非常的方便。 但最大的问题就是虽然说是O(nlogn)-O...

Miserable_ccf的博客 599

新手也能写复杂爬虫!AI+Python自动分析京东商品,提取数据不用F12

不用F12:AI自动分析京东页面,生成选择器;不用懂JS:Playwright自动渲染动态数据;不用改代码:只需配置3个参数,复制运行就能出结果。这套方案不仅适用于京东,修改提示词后还能爬取淘宝、拼多多、亚马逊等电商网站,新手只需掌握“配置参数→运行代码→查看CSV”3步,就能轻松获取任意网站的结构化数据。未来,AI会让爬虫彻底进入“零代码、零门槛”时代,新手也能轻松搞定复杂数据爬取需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1340

Fiori Elements 的 Adapting the UI: Analytical List Page 全解析与实战

摘要:本文详细介绍了如何通过SAP Fiori elements的UI Adaptation功能对Analytical List Page(ALP)进行细粒度适配。重点讲解了页头过滤区、图表区域、表格区域等关键组件的可配置属性,包括过滤区折叠/固定、图表类型限制、表格滚动阈值等实用功能。文章强调这些适配均可通过可视化工具完成,无需修改业务代码,并提供了典型场景的实践清单。适用于SAP Fiori elements for OData V2项目,建议配合SAP Fiori tools的Adaptation E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 432

线段树入门(一)

接触线段树前我们先看一道比较经典的题目。 HDU 1166 敌兵布阵 这道题要求我们对一个区间内的单个值进行修改,并查询一段区间的和。对于修改,我们很容易暴力的修改,复杂度为O(1),但查询的复杂度就变成了O(n),总复杂度为O(n*m),由于n和m都很大,所以这样肯定会超时的。对于区间和我们常见的操作有前缀和,用前缀和可以将查询操作的复杂度降为O(1),但修改操作的复杂度则会升到O(n)...

weixin_30892987的博客 61

解决RabbitMq登录时报出Not management user(Login failed)错误以及rabbitmqctl(RabbitMq)新增用户和用户角色权限

解决RabbitMq登录时报出Not management user(Login failed)错误以及rabbitmqctl(RabbitMq)查看用户权限、新增用户和用户角色权限。

念兮为美 7479

线段树(一)

给定一个正整数数列 a1​,a2​,…,an​,每个数都在 0∼p−1 之间。对于每个 k=1 的查询指令,输出一个整数表示区间 [x, y] 的最大连续子段和,每个结果占一行。程序运行的最开始,整数序列为空。请写一个程序,读入操作的序列,并输出询问操作的答案。对于每一个询问操作,输出一行,该行只有一个数,即序列中最后 L 个数的最大数。对于每个询问,输出一个整数表示答案,每个答案占一行。对于每个询问,输出一个整数表示答案。对于每个查询指令,输出对应的结果。

2401_87934559的博客 536

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

线段树模板一

线段树练习题一 Time Limit:10000MS Memory Limit:65536K Total Submit:263 Accepted:93 Case Time Limit:1000MS Description 桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少? Sample Input 20 //桌面总宽度 4 //盒子数量 1 5 3 8 7 10 13 19 Sample Output 1

yl_2018的博客 236

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

线段树练习题一

这道题可以用线段树,但是我用了离散化。 不过我接着又学了线段树,然后就补上去了。

欢迎您的光顾awa 263

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

线段树一

下面的题目都是更新点查找区间或者是更新区间查找点的题目,这一类属于比较简单的线段树的题目,可以用来入门或者加强对线段树的理解。 后面几道稍微有点难想到,但是想到怎么使用线段树之后就是简单的是用线段树了。 HDU 1754 http://acm.hdu.edu.cn/showproblem.php?pid=1754 简单的更新点的值,查找区间的最大值,很好写。 HDU

Bright 1031

线段树练习题一(线段树)

线段树练习五 Description 一行N个方格,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N≤100000,提问和修改的总数可能达到100000条。 Input 20 //方格个数 6 //有几组操作 M 1 1 //表示修改,第一个表示格子位置,第二个数表示在原来的基础上加上的数, M 2 2 M 3 4 M 3 -5 M 6 7

我很菜的好吧 1253

【线段树】线段树练习题一

桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少? Input 第一行,一个数m代表桌面宽度 第二行,一个数n代表盒子数量 第2到n+2行,每行两个数代表盒子开始与结束的位置 Output 一个数,影子的总宽度 Sample Input 20 4 1 5 3 8 7 10 13 19 Sample O...

鲤の游 210

线段树练习题一【线段树】

>Description 桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少? >Input 第一行输入一个整数n,表示桌面总宽度 第二行输入一个整数m,表示盒子数量 接下来m行,每行输入两个数x,y,表示第i个盒子的起始位置和终止位置 >Output 阴影宽度 >Sample ...

//(^ o ^)// 229

线段树练习一 题解

线段树练习一 题解 线段树练习一 题目 桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少? 样例 input 20 //桌面总宽度 4 //盒子数量 1 5 3 8 7 10 13 19 output 15 数据范围 1<=nnn<=100000,1<=mmm<=100000,保证坐标范围为[1,nnn]. 代码 #include<iostream> #inclu

Y的博客 217

【线段树】SSLOJ 2644 线段树练习一

桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?

blog 248

【离散化】【线段树】线段树练习题一

线段树练习题一 题目 桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少? 输入 第一行,一个数 TTT 代表桌面总宽度 第二行,一个数 NNN 代表盒子数量 接下来,NNN行,每一行两个数,aaa和bbb 代表盒子的长度 输出 影子的长度 输入样例 20 4 1 5 3 8 7 10 13 19 输出样...

CW. 222
上一篇: hdu 1732 Push Box(BFS)
下一篇: 二维计算几何模板
yjCola
博客等级 码龄14年 4粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值