标记永久化

opencv-meshgrid 使用opencv::repeat函数和std::iota函数完成meshgrid功能。 X Y Z 通俗的说就是根据Z的大小生成X矩阵,Y矩阵 阅读详情

1.概述
在可持久化线段树中,我们常常要使用区间修改操作。这时候,如果再用下传标记再向上更新的方式来实现就会变得十分麻烦。

那么,有没有一种实现线段树区间修改的方式可以不用下传标记或向上更新呢?有,那就是标记永久化。
2.原理
标记永久化的原理简单来说就是修改时一路更改被影响到的点,询问时则一路累加路上的标记,从而省去下传标记的操作。
3.代码实现
3.0 说明
这里以区间修改区间求和的线段树为例。
线段树中编号为p的结点的值和标记分别为val[p]和mark[p]。
3.1 建树
标记永久化线段树的建树和标记不永久化线段树的建树没有什么区别,这里就不在赘述,直接上代码吧。

procedure build(p,l,r:longint);
var
        mid:longint;
begin
        if (l=r) then
        begin
                read(val[p]);
                exit;
        end;
        mid:=(l+r)>>1;
        build(p<<1,l,mid);
        build(p<<1+1,mid+1,r);
        val[p]:=val[p<<1]+val[p<<1+1];
end;

3.2 区间修改
0.设要将区间[x,y]中的数都加上v。
1.一路走下去同时更新路上受此次修改影响的节点的值,即inc(val[p],(y-x+1)*v)。
2.当目前结点所代表的区间与待修改区间完全重合时,更新标记,返回,即inc(mark[p],v);

procedure odd(p,l,r,x,y:longint;v:int64);
var
        mid:longint;
begin
        inc(val[p],(y-x+1)*v);
        if (l=x) and (r=y) then
        begin
                inc(mark[p],v);
                exit;
        end;
        mid:=(l+r)>>1;
        if (y<=mid) then odd(p<<1,l,mid,x,y,v)
        else if (x>mid) then odd((p<<1) or 1,mid+1,r,x,y,v)
        else
        begin
                odd(p<<1,l,mid,x,mid,v);
                odd((p<<1) or 1,mid+1,r,mid+1,y,v);
        end;
end;

有人可能会问:标记更新后直接返回的话下面的结点不就没更新了吗?
慢慢来嘛,往下看就明白了。

3.3 区间查询
0.设求区间[x…y]中数的总和
1.一路走下去同时累加路上的标记,因为在修改操作中标记并没有下传,所以要这样子,即inc(ad,mark[p])。
2.当目前结点所代表的区间与待修改区间完全重合时,返回当前结点的值与累加下来的标记乘上询问区间长度的和,即exit(val[p]+(y-x+1)*ad)。

function ask(p,l,r,x,y:longint;ad:int64):int64;
var
        mid:longint;
begin
        if (l=x) and (r=y) then exit(val[p]+(y-x+1)*ad);
        mid:=(l+r)>>1;
        if (y<=mid) then exit(ask((p<<1),l,mid,x,y,ad+mark[p]));
        if (x>mid) then exit(ask((p<<1) or 1,mid+1,r,x,y,ad+mark[p]));
        exit(ask(p<<1,l,mid,x,mid,ad+mark[p])+ask(p<<1 or 1,mid+1,r,mid+1,y,ad+mark[p]));
end;

4.练习题
luogu P3372

var
        val,mark:array[0..400005] of int64;
        n,m,i,opt,k,x,y:longint;
procedure build(p,l,r:longint);
var
        mid:longint;
begin
        if (l=r) then
        begin
                read(val[p]);
                exit;
        end;
        mid:=(l+r)>>1;
        build(p<<1,l,mid);
        build(p<<1+1,mid+1,r);
        val[p]:=val[p<<1]+val[p<<1+1];
end;

procedure odd(p,l,r,x,y:longint;v:int64);
var
        mid:longint;
begin
        inc(val[p],(y-x+1)*v);
        if (l=x) and (r=y) then
        begin
                inc(mark[p],v);
                exit;
        end;
        mid:=(l+r)>>1;
        if (y<=mid) then odd(p<<1,l,mid,x,y,v)
        else if (x>mid) then odd((p<<1) or 1,mid+1,r,x,y,v)
        else
        begin
                odd(p<<1,l,mid,x,mid,v);
                odd((p<<1) or 1,mid+1,r,mid+1,y,v);
        end;
end;

function ask(p,l,r,x,y:longint;ad:int64):int64;
var
        mid:longint;
begin
        if (l=x) and (r=y) then exit(val[p]+(y-x+1)*ad);
        mid:=(l+r)>>1;
        if (y<=mid) then exit(ask((p<<1),l,mid,x,y,ad+mark[p]));
        if (x>mid) then exit(ask((p<<1) or 1,mid+1,r,x,y,ad+mark[p]));
        exit(ask(p<<1,l,mid,x,mid,ad+mark[p])+ask(p<<1 or 1,mid+1,r,mid+1,y,ad+mark[p]));
end;

begin
        readln(n,m);
        build(1,1,n);
        for i:=1 to m do
        begin
                read(opt,x,y);
                if (opt=1) then
                begin
                        read(k);
                        odd(1,1,n,x,y,k);
                end
                else
                        writeln(ask(1,1,n,x,y,0));
        end;
end.

5.标记永久化线段树和标记不永久化线段树的差异

标记永久化线段树用时:
在这里插入图片描述
标记不永久化线段树用时:在这里插入图片描述
明显快了很多。
并且码量也少了很多。

【网络协议】【TSN】精讲TSN工作原理!图解超赞超详细!!! TSN有一个服务等级(class of service,CoS)的概念。对TSN网络而言,不同优先级的服务对应图3中的PCP码。3位PCP码定义了0(最低)~7(最高)这8个优先级,传输类型分别对应基础、最大努力、卓越努力、严苛应用、延时和抖动小于100 ms的视频、延时和抖动小于10 ms的音频、内部网络控制、网络控制。其会对网络场景进行不同的匹配,是后续调度、配置设计中会考虑到的数据流调度因素。 阅读详情

相关推荐

Vivado工程芯片型号更换全流程:从IP更新到生成新bit文件(避坑指南)

本文详细介绍了Vivado工程中更换芯片型号的全流程,包括IP更新、约束文件适配和生成新bit文件的关键步骤。特别针对FPGA开发中常见的兼容性问题提供避坑指南,帮助开发者高效完成芯片迁移,确保设计稳定性和性能优化。

weixin_42549451的博客 298

浅谈标记永久化

一般我们写线段树等数据结构的时候都会写需要下防的标记,虽然不是很复杂,但是在面对持久化数据结构或树套树的时候,我们就需要一个技巧,就是标记永久化。。 我扔http://acm.hdu.edu.cn/showproblem.php?pid=4348 这是到经典的主席树练习题,然而再区间修改的时候要用到标记永久化。 标记永久化怎么做呢? 首先标记永久化肯定是不下传,我们只需在询问的过程中计算每...

lahlah的博客 1万+

谷歌账号国家或地区设置修改全攻略:条件、流程与避坑指南

谷歌账号的国家或地区设置与付款资料、账号历史行为及登录环境强绑定,修改时需满足特定条件。其原理在于地区作为索引键,关联内容库、货币结算和风控策略。正确切换可解决内容推荐错乱、付款失败等问题,适用于搬家、订阅区域限定服务等场景。操作前需在目标地区创建付款资料、清空余额并取消订阅,且一年仅能修改一次。本文详解从准备到验证的完整流程,并揭示官方文档未提及的实操陷阱,助你安全完成地区切换。

weixin_42521558的博客 2333

[学习笔记]标记永久化

线段树出了名的操作是lazy标记。 普通lazy标记涉及到pushup和pushdown 这个pushup只涉及两个儿子合并,并且两个儿子是两个点。 但是有的时候,两个儿子是两个树,pushup复杂度就爆炸了。 给你一个线段树的树套树,外层的线段树pushup一下,就对应里面每个节点对应pushup。O(n^2log^2n)优秀数据结构诞生辣 还有的时候,主席树要区间修改。 每次...

weixin_33830216的博客 465

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 285

低代码Agent开发框架使用指南(二)—Coze平台核心功能概览

本篇分享系统介绍了字节跳动推出的低代码智能体开发平台Coze。Coze以免费易用、多模型支持和便捷的跨平台发布为核心优势,显著降低了智能体开发门槛。文章详细解析了平台的六大核心功能:扩展能力边界的插件系统、增强认知的知识库、结构化数据管理的数据库、可视化图像处理的图像流、实现复杂逻辑编排的工作流,以及处理复杂任务的多智能体协作机制,全面展现了Coze平台的强大能力。

weixin_42782643的博客 1358

11.1.2 蓝桥杯树形数据结构之线段树之标记永久化

标记永久化是一种线段树的懒惰传播技术,用于优化区间修改操作。在传统的线段树实现中,当一个区间更新时,我们需要立即更新所有相关节点的信息并传播这个更新到所有叶子节点,这在某些情况下可能会导致不必要的计算。而标记永久化技术允许我们将更新操作的标记“延迟”或“懒惰”地存储在节点中,仅在实际需要时才进行具体的更新计算。标记永久化是线段树优化中的一个高级技巧,通过懒惰更新机制,提高了处理大规模区间操作问题的效率和灵活性。

tang7mj的博客 886

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

线段树 标记永久化

永久化标记就是不需要下传lazy标记,修改的时候一路更改要改的点,询问的时候累加标记即可。 这里以区间赋值为例,注意modify的时候不需要pushup。 #pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctyp

DaNIelLAk的博客 456

面渣逆袭之Java基础篇2

Tips:所有的关键字都是小写的,在 IDE 中会以特殊颜色显示。default 这个关键字很特殊,既属于程序控制,也属于类,方法和变量修饰符,还属于访问控制。①在程序控制中,当在 switch 中匹配不到任何情况时,可以使用 default 来编写默认匹配的情况。②在类,方法和变量修饰符中,从 JDK8 开始引入了默认方法,可以使用 default 关键字来定义一个方法的默认实现。③在访问控制中,如果一个方法前没有任何修饰符,则默认会有一个修饰符 default,但是这个修饰符加上了就会报错。

m0_73804764的博客 1109

深入解析FOC电流环PI参数整定:从理论到实践

本文深入解析了FOC(磁场定向控制)中电流环PI参数整定的核心原理与实践方法。文章从永磁同步电机模型出发,详细阐述了基于带宽与零极点对消的工程法及考虑逆变器延迟的二阶系统整定法两种经典策略,并提供了从理论计算到安全上电调试的完整步骤与常见问题解决方案,帮助工程师精准调校电机控制性能。

weixin_29164497的博客 450

线段树标记永久化

前言 对于树套树,主席树等使用到线段树的比较复杂的数据结构,如果区间修改的话,打标记后pushdown或者pushup是很难做到的完全不行吧 所以这个时候,一个神奇的东西诞生了。。。 正题 线段树标记永久化,维护一个标记,假设为cov,再维护一个sum 假设修改区间[ql, qr]全部加上v: 和平常一样,到这个区间后cov[x] += v 但是我们又不想pushup,怎么办? ...

Cyhlnj 1207

实战分享:如何用Dify和MaxKb实现文档智能切分与高效检索(附代码解析)

本文详细介绍了如何结合Dify和MaxKB构建文档智能切分与高效检索系统。针对传统全文检索的不足,提出了结构感知的文档切分方案,通过解析文档层级关系并构建标题链,实现了精准的章节级检索。文章包含完整的代码实现,涵盖文档解析、智能切分、向量化策略及双索引优化,并分享了性能调优和生产环境实践经验。

qsc90123456的博客 546

线段树—永久化标记优化

标记永久化介绍 诞生 正常的线段树的改段求段都离不开lazy标记,lazy标记维护时要及时的更新,即人们熟知的pushdown函数。 那么能不能避免这么多次无意义的pushdown操作呢?他就是——标记永久化。 原理 举个最简单的例子,线段树区间修改,求区间最大值。 这时的lazy存的是当前这一段待下传的最大值,也就是说这个lazy最终会更新到这个线段的所有子线段。既然是他们共有的一个最大...

A_Bright_CH的博客 2072

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【复习】线段树(3)区间修改与lazy标记——标记永久化

对线段树的lazy标记,分别有“标记下传”与“标记永久化”两种操作思路,上一篇写了“标记下传”,这一篇写“标记永久化”。 “标记永久化”与“标记下传”相比,区别在于“标记永久化”在更新节点时,就一次性将所有需要更改的节点的标记修改完成,查询时无需对标记进行修改。 以查询信息为区间和为例,用“标记永久化”思路进行解题。 存储信息用的数组同样需要两个,sum[]记录区间和,add[]记录区间增加标记。...

qq_44950755的博客 802

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

模板:线段树标记永久化

为了那不可知的询问永远坚守于此 解析 众所周知线段树的区间修改是需要打懒标记的 多数时候,这个标记在询问子区间时需要下传 而标记永久化,就是指不下传懒标记的一种操作 在某些时候标记不便下传时有所应用 比如zkw线段树和二维线段树等 然而zkw线段树我并不会 还能起到一定的常数优化作用 (这是真的卡常卡疯了) 这个操作是有局限性的 那就是:不可逆性 比如说 标记永久化可以维护区间赋值和维护最大值 但前提是区间赋值必须不小于区间内原来的值 否则就无法操作 细节: pushup的时候一定要把自己身上的懒标记.

BUG_Creater_jie的博客 996

SAP B1中文培訓教材_SDK

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

线段树-标记永久化技巧

内容 顾名思义.就是区间修改时,懒标记不下传. 好处 1.码量小,不用写pushdown和pushup 2.在可持久化线段树上应用该技巧能做到区间修改的效果 坏处 1.适用范围有限,只有当求的东西满足区间贡献独立。比如区间加法。 区间最大值就无法标记永久化 2.多标记好像也不适用 模板:洛谷P3372 #include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int>

qq_35577488的博客 1105

ROS图像预处理:时间戳对齐、零拷贝与工业级稳定性设计

ROS图像预处理并非简单的OpenCV函数调用,而是面向机器人实时系统的数据治理工程。其核心在于保障图像消息在时间维度(header.stamp一致性)、内存维度(cv_bridge零拷贝)和接口维度(encoding契约)上的严格约束。原理上需兼顾传感器数据流的时序完整性、跨节点通信的带宽敏感性及多模块协同的类型安全性;技术价值体现在提升SLAM建图精度、降低目标检测误检率、增强弱光/雨雾等复杂场景鲁棒性;典型应用场景包括视觉导航、工业AGV避障、巡检机器人多光照自适应处理。本文聚焦ROS语境下图像预处理

weixin_34166472的博客 433

线段树的懒操作与标记永久化

线段树的懒操作的中心思想是把一整段区间敲碎,用碎片化的几段组成一整段,而这碎片化的几段的sum值是直接被修改的。然后再在这些碎片化的段上打上标记,使得下次需要其他碎片组成新段的时候看看某些碎片是不是之前打上标记的碎片的一部分,若是的话则在这些新的碎片上加上所要加的值,然后去掉老碎片的标记。而永久标记化则是一种一劳永逸的做法,把一整段敲碎,把所有涉及到的碎片都打上标记,不去改变sum的值,然后再在查询的过程中若涉及到修改的碎片则加上标记值*(段的长度)。任何的的懒操作和标记永久化的写法都是对这个过程的模拟。懒

weixin_45608039的博客 1189

二维线段树+标记永久化 poj2155

省选后一个月的练手

huyuncong的专栏 1739
下一篇: JZOJ5049 [GDOI2017模拟一试4.11] 腐女的生日
Nazo_zzh
博客等级 码龄7年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值