线段树学习笔记

system_stm32f10x.c文件分析 配置系统时钟(包括系统时钟源、锁相环(PLL)倍频系数、高级高性能总线(AHB)/ 高级外设总线(APBx)预分频器以及闪存相关设置)。该函数在系统复位后的启动阶段被调用,且调用时机早于跳转到主程序之前。 阅读详情

线段树学习笔记


线段树注意事项

  1. 线段树是一种常数非常大的数据结构,谨慎使用。
  2. 线段树在开 空间 时 不能吝啬 。

基础线段树(一维)

递归思想:模版

struct Segment_Tree{
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (tr[p].l+tr[p].r>>1)
    int n;
    struct node{
        int l,r,len,c,mark;
    }tr[N<<2];
    /*初始化*/
    void init(int _n){
        return (void)(n=_n,build(1,n,1));
    }
    /*建树*/
    void build(int l,int r,int p){
        tr[p]={l,r,r-l+1,0,0};
        if(l==r)return (void)(tr[p].c=Local[l]);
        build(l,mid,ls);
        build(mid+1,r,rs);
        push_up(p);
    }
    /*传递*/
    void push_up(int p){
        tr[p].c=tr[ls].c+tr[rs].c;
    }
    void push_down(int p){
        if(tr[p].len<=1)return;
        tr[ls].mark+=tr[p].mark;
        tr[rs].mark+=tr[p].mark;
        tr[ls].c+=tr[p].mark*tr[ls].len;
        tr[rs].c+=tr[p].mark*tr[rs].len;
        tr[p].mark=0;
    }
    /*修改*/
    void update(int p,int l,int r,int d){
        if(l<=tr[p].l&&tr[p].r<=r)return tr[p].c+=tr[p].len*d,tr[p].mark+=d,void();
        push_down(p);
        if(mid>=l)update(ls,l,r,d);
        if(mid<r)update(rs,l,r,d);
        push_up(p);
    }
    /*查询*/
    int query(int p,int l,int r){
        if(l<=tr[p].l&&tr[p].r<=r)return tr[p].c;
        push_down(p);
        int ans=0;
        if(mid>=l)ans+=query(ls,l,r);
        if(mid<r)ans+=query(rs,l,r);
        return ans;
    }
#undef ls
#undef rs
#undef mid
}seg;

递推思想:模版

struct Recursion_Segment_Tree{
    #define ls(p) (p<<1)
    #define rs(p) (p<<1|1)
    int n,m,c[N<<2],mark[N<<2];//精髓:延迟标记 
    void init(int _n){
        return (void)(n=_n,build(n));
    }//初始化 
    void build(int n){
        m=1;while(m<n+2)m<<=1;
        FOR(i,1,n)c[m+i]=a[i];
        DOR(i,m-1,1)c[i]=c[ls(i)]+c[rs(i)],mark[i]=0;
    }//建树
    void update(int l,int r,int d){
        int s,t,lc=0,rc=0,x=1;
        for(int s=m=l-1,t=m+r+1;s^t^1;s>>=1,t>>=1,x<<=1){
            c[s]+=d*lc;
            c[t]+=d*rc;
            if(~s&1)c[s^1]+=d*x,lc+=x,mark[s^1]+=d;
            if(t&1)c[t^1]+=d*x,rc+=x,mark[t^1]+=d;
        }
        for(;s;s>>=1,t>>=1){
            c[s]+=d*lc;
            c[t]+=d*rc;
        }return;
    }//区间修改 
    int query(int l,int r){
        int lc=0,rc=0,x=1;
        int ans=0;
        for(int s=m=l-1,t=m+r+1;s^t^1;s>>=1,t>>=1,x<<=1){
            if(mark[s])ans+=mark[s]*lc;
            if(mark[t])ans+=mark[t]*rc;
            if(~s&1)ans+=c[s^1],lc+=x;
            if(t&1)ans+=c[t^1],rc+=x;
        }
        for(;s;s>>=1,t>>=1){
            ans+=mark[s]*lc;
            ans+=mark[t]*rc;
        }return ans;
    }//区间查询 
};

标记永久化:扔在主席树部分了。

相关资料

  1. 线段树详解 (原理,实现与应用) - AC_King - 博客园 (cnblogs.com).
  2. 线段树详解 (原理,实现与应用)-优快云博客.
  3. 线段树(segment tree)、区间树(interval tree) - 知乎 (zhihu.com).
  4. 线段树 - OI Wiki (oi-wiki.org).
  5. 线段树 从入门到进阶(超清晰,简单易懂)_线段树怎么写-优快云博客.

求区间第 k 大值的若干方法 - 洛谷专栏 (luogu.com)

树状数组+主席树 ,解决动态第k大问题 - 知乎 (zhihu.com).


线段树优化建图

线段树优化建图学习笔记-优快云博客


权值线段树

就是把值域当线段…(真正理解线段树的朋友应该可以懂)


扫描线

线段树+扫描线算法学习笔记-优快云博客


主席树(可持久化线段树)

主席树(可持久化线段树)学习笔记-优快云博客


势能线段树

势能线段树学习笔记-优快云博客


线段树解题思路

在考试的时候,如果感到紧张,可以学着像我一样用下面的方法:

  • 确定自己的线段树是用来干嘛的,把它的用途以及各种标记确定下来;

  • 开始建树,如果你感到很烦躁,紧张,或是无处下手,可以另开一个文件,专心沉浸在建树之中。建树时,也分步进行,可以沿用我下面的模版(有些没必要就省了吧):

struct Segment_Tree{
    /*定义宏变量*/
    /*定义变量*/
    /*初始化*/
    /*建树*/
    /*传递*/
    /*修改*/
    /*查询*/
}seg;
  • 回到主程序,完成题目的要求,然后你会发现简单了许多。
蓝桥杯第七届省赛试题--“模拟风扇控制系统” 题目要求 功能简述 “模拟风扇控制系统”能够模拟电风扇工作,通过按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间,系统主要由数码管显示、单片机最小系统、按键输入和电机控制保护电路组成,系统框图如图 1 所示: 单总线驱动程序、CT107D 单片机考试平台电路原理图以及本题所涉及到的芯片数据手册,可参考计算机上的电子文档。程序流程图及相关工程文件请以考生... 阅读详情

相关推荐

定制PYNQ的overlay

一、用HLS生成一个定制IP(加速器)(1)首先打开vivado hls,本人的版本是2017.2,点击创建一个新工程。(2)设置工程名和路径,顶层函数设置为add,创建一个新的C++程序,名字叫做adder.cpp,不用在testbench中添加文件。选择板子的时候搜索xc7z020clg400-1,这是PYNQ的板子号,选择完成。             (3)在左侧的菜单栏里选择Sourc...

bramblewalls的博客 1万+

线段树知识整理

线段树是算法竞赛中常用的用来维护区间信息的数据结构。线段树可以在O(logN)O(logN)O(logN)的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。......

m0_61409183的博客 1014

字节跳动高频111道核心前端面试题解析,web开发增强

但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。自定义指令(v-check、v-focus)的方法有哪些?v-model是什么?

2401_84094620的博客 1200

线段树各种神操作

接下来就到了大名鼎鼎的线段树了! 线段树是一种维护区间可加信息的数据结构 传说中无所不能,神通广大的它到底有什么本事呢 请看今日说法 技能一 区间最大值  稀有程度 普通 RMQ问题,是各种数据结构的裸题,也不一定非要用线段树做,常数很大,ST表显然是一个很好的选择 但是就是一道练手题 Code #include&lt;cstdio&gt; #include&lt;iostrea...

Richard__Luan的博客 492

pe卸载win10更新补丁_禁用Win10系统更新

众所周知,最近WIN10的强制更新导致了很多问题。如:(部分专业软件系统更新后无法使用,硬件中键盘、鼠标、指纹之类的硬件,更新补丁后失灵等问题)。而之前的禁用WindowsUpdate的方法已经失效。下面我们另辟蹊径,利用系统权限的方法使Win10无法更新,达到禁用更新的目的。1.计算机管理-服务中禁用Windows Update服务。2.打开C:\Windows\softwareDistribu...

weixin_39702479的博客 1万+

CP2102 USB 转 UART 模块 PCB 设计项目

不幸的是,我的笔记本电脑只有 USB 端口,所以我需要在 USB 端口和 UART 接口之间进行转换。PCB 布局将足够小,因此我们不一定需要高速布线 USB 线路,但我们将在此将其作为一个简单的示例来实现,以展示如何在这种类型的电路板上实现它。相反,我们只使用屏幕左侧的电路。在这里,我们利用对之间的间距和到 L1 上的铜灌注的距离将差分阻抗设置为目标值。初始布局分为两个部分:USB 连接器和 USB 线路的 TVS 二极管放置在电路板左侧,带有二极管 D4 和 D5 的引脚接头放置在电路板右侧。

jkh920184196的博客 2401

数据结构(终极线段树篇)

数据结构(终极线段树篇) 摘要: 问题的提出:如何解决多样化的区间操作问题? solve:线段树!!! 关键字: 线段树,可持久化线段树,权值线段树,线段树森林,动态开点线段树,区间操作,线段树应用。 前言: 区间操作问题的解决方法极多,如:树状数组,RMQ等。 所有这些数据结构都具有一定的局限性,都具有各自的优势和劣势。 而线段树无疑是这些数据结构中性价比...

xmr_pursue_dreams的博客 620

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 212

线段树&&树状数组 总结

树状数组、线段树、zkw线段树总结

Rayment的博客 690

【ESP32接入国产大模型之豆包】

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之豆包。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘。

vor234的博客 1万+

NVIDIA Isaac Sim 入门教程(一)

文档分为以下几个部分: 简介、安装指南、API 文档、教程、手册和参考资料。简介部分是对 Omniverse Isaac Sim 的基本概述,以及它如何融入 NVIDIA Omniverse™ 生态系统。它还概述了 Omniverse Isaac Sim 的架构、工作流程和文档布局。

机器人控制与仿真应用 1万+

关于如何减小线段树常数

以前写线段树常数巨大,因为懒所以一直没改,今天终于下定决心把线段树常数调小 0.位运算,前置技能 1.非递归是一定要有的,以前觉得非递归特别特别麻烦,今天写了一下发现比递归好写 2.不要一直改变l,r,能在build时记录下来就不要每次更新了 3.能从下往上修改就从下往上吧 4.线段树不管什么地方,加一句话常数都会变大,如果是加个函数就更大了 比如说我们会记录最大值 mx[now]=

lcrtest的博客 2831

快速生成2D卡通人物的AI工具:开启Live2D角色创作的新时代

随着这一创新工具的推出,我们正见证着Live2D角色创作进入了一个全新的阶段。它不仅极大地简化了角色设计的过程,也为广大创作者提供了一种全新的表达方式。对于那些渴望将脑海中的构思迅速转化为现实的人来说,这无疑是一大福音。现在就访问项目主页,开始探索无限可能吧!t=O83A项目主页https://human3daigc.github.io/Textoon_webpage/

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 4835

线段树学习笔记 - 动态开点线段树

线段树学习笔记。线段树学习笔记 - 练习题(1)。线段树学习笔记 - 练习题(2)。线段树学习笔记 - 练习题(3)。算法讲解114【扩展】线段树专题5-开点线段树、区间最值和历史最值,题目都是左神视频上的,思路也可以看这个视频。

Jwasx的博客 1194

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 蓝牙通讯demo

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

线段树合并学习笔记

线段树合并学习笔记 正文 线段树合并简介 把两棵权值线段树的信息合并。 把若干棵共有有m个元素的权值线段树合并,权值范围是1~n,时间复杂度大概是O(\(mlogn\)) 实现 int merge(int k1,int k2,int l,int r)//合并k1,k2两棵线段树的信息 { if ((k1==0)||(k2==0)) return k1+k2;//若一个节点为空则返回另一个 ...

weixin_30765475的博客 116

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NOIP学习笔记——线段树基础

本文详细介绍了线段树的实现与应用。线段树是一种能够在O(logN)时间复杂度内完成单点修改、区间修改和区间查询的数据结构。文章首先讲解了线段树的基本概念和建树方法,强调需要开四倍空间以防止越界。接着详细说明了查询操作的实现逻辑,包括如何判断是否需要遍历子树。重点介绍了区间修改中的懒标记(lazy_tag)技术,通过延迟更新来提高效率。还提供了加乘线段树和简单题两个应用实例,展示了如何通过线段树解决实际问题。最后给出了完整的模板代码实现,包括建树、查询、修改等核心功能。

fhhhcc的博客 605

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

李超线段树学习笔记

李超线段树学习笔记 入门博客 模板 其实是线段树标记不下传的一个思想。最终的答案应该是查询log个结点得出的。 每次更新会将较劣势的线段下传,因为劣势线段最多只会占当前区间的一半,所以只要下传一半即可。 ...

323

线段树学习笔记 - 练习题(3)

线段树学习笔记。线段树学习笔记 - 练习题(1)。线段树学习笔记 - 练习题(2)。算法讲解113【扩展】线段树专题4-线段树解决区间合并的问题,题目都是左神视频上的,思路也可以看这个视频。

Jwasx的博客 639

李超线段树 & 树链剖分 学习笔记

李超线段树 & 树链剖分 学习笔记(摘自2025年日祭)

一枚初中生的博客 1104

【学习笔记】线段树详解(全)

【学习笔记】线段树详解(全) 和三个同学一起搞了接近两个月的线段树,头都要炸了T_T,趁心态尚未凉之前赶快把东西记下来。。。 【目录】 【基础】作者:\((Silent\)_\(EAG)\) 【懒标记】作者:\((Silent\)_\(EAG)\) 【扫描线】作者:\((IC\)_\(QQQ)\) 【权值线段树】作者:\((Xing\)_\(Ling)\) 【动态开点】作者:\((X...

weixin_30929011的博客 199

【线段树1】学习笔记

一、线段树求子节点 二叉树的特性:二叉树里,每个父亲节点的编号为k,则他的两个儿子节点的编号分别为2k,2k+1。 通过这个特性可以求出父亲节点的两个儿子,且保持用时为O(1): #define ll long long inline ll leftson(ll p){return p<<1;} //左儿子 inline ll rightson(ll p){ret...

tidongCrazy的博客 207

线段树学习笔记 - 练习题(2)

线段树学习笔记。线段树学习笔记 - 练习题(1)。算法讲解112【扩展】线段树专题3-线段树维护更多类型的信息,题目都是左神视频上的,思路也可以看这个视频。

Jwasx的博客 1141

线段树学习笔记 - 练习题(1)

线段树学习笔记。算法讲解111【扩展】线段树专题2-线段树的离散化、二分搜索、特别修改,题目都是左神视频上的,思路也可以看这个视频。

Jwasx的博客 786
上一篇: 主席树(可持久化线段树)学习笔记
下一篇: 二维莫队复杂度分析及块长计算
Add_Catalyst
博客等级 码龄3年 211粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值