【蓝桥刷题】备战国赛——区间修改、区间查询

蓝桥杯线段树模板题——区间修改、区间查询



🚀 每日一题,冲刺国赛 🚀

在这里插入图片描述


题目导航:

区间修改、区间查询

在这里插入图片描述


🎇思路:线段树

🔱思路分析:

本题涉及到了对区间操作的问题,因此,我们可以用线段树解决

step:

首先定义线段树 : tree=[0]*(n<<2)

  1. 建树
def build(p,pl,pr):
    if pl==pr:
        tree[p]=a[pl] # 更新叶子结点
        return
    mid=(pl+pr)>>1
    build(p<<1,pl,mid)
    build(p<<1|1,mid+1,pr)
    tree[p]=tree[p<<1]+tree[p<<1|1] # 更新父结点

  1. 更新
    u p d a t e update update用于更新区间的值,把区间内所有元素的值加上 d d d,如果 t r e e [ p ] tree[p] tree[p]这棵子树完全被包含在所要修改的区间 [ L , R ] [L,R] [L,R]内,只需要对根结点 t r e e [ p ] tree[p] tree[p]打上懒标记 t a g tag tag即可,不需要继续往下修改 p p p的子结点


    ①打标记addtag

    给结点打上懒标记+更新结点的值

    代码实现:

    def addtag(p,pl,pr,d):
        tag[p]+=d # 给p结点打上懒标记
        tree[p]+=d*(pr-pl+1) # 更新p结点(p结点为子树的根节点)
    

    ②push_down

    如果 t r e e [ p ] tree[p] tree[p]这棵子树不能完全包含在 [ L , R ] [L,R] [L,R]中,但是在之前的修改中又已经给 t r e e [ p ] tree[p] tree[p]打上了懒标记,那么为了解决冲突,需要用 p u s h d o w n push_down pushdown进行解决:


    key:将根节点的tag向下传递给左右子树

    代码实现:

    def push_down(p,pl,pr):
        if tag[p]!=0: # 之前对p进行过修改,有懒标记
            mid=(pl+pr)>>1
            addtag(p<<1,pl,mid,tag[p]) # 将懒标记传递给左结点
            addtag(p<<1|1,mid+1,pr,tag[p]) # 将懒标记传递给右结点
            tag[p]=0 # 清空p结点的懒标记
    

    ③更新:

    def update(p,L,R,pl,pr,d): # 将区间[L,R]加上d
        if L<=pl and R>=pr:
            addtag(p,pl,pr,d) # 更新所包含子树的根节点
            return
        mid=(pl+pr)>>1
        if L<=mid:
            update(p<<1,L,R,pl,mid,d)
        if R>mid:
            update(p<<1|1,L,R,mid+1,pr,d)
        tree[p]=tree[p<<1]+tree[p<<1|1]
    

  1. 查询

区间查询时,要对查询的区间结点消除 t a g tag tag标记,这样才是当前该区间的真实值

代码实现:

def query(p,L,R,pl,pr):
    if L<=pl and R>=pr: # 要查询的区间[L,R]包含了当前的[pl,pr]
        return tree[p] # 返回这个结点的值

    push_down(p,pl,pr) # 向下传递懒标记(一路向下更新结点值)

    mid=(pl+pr)>>1
    ans=0
    if L<=mid:
        ans+=query(p<<1,L,R,pl,mid) # 得到满足条件的左子树的和
    if R>mid:
        ans+=query(p<<1|1,L,R,mid+1,pr) # 得到满足条件的右子树的和
    return ans

完整代码实现:

# 1.建树
def build(p,pl,pr):
    if pl==pr:
        tree[p]=a[pl] # 更新叶子结点
        return
    mid=(pl+pr)>>1
    build(p<<1,pl,mid)
    build(p<<1|1,mid+1,pr)
    tree[p]=tree[p<<1]+tree[p<<1|1] # 更新父结点


# addtag
def addtag(p,pl,pr,d):
    tag[p]+=d # 给p结点打上懒标记
    tree[p]+=d*(pr-pl+1) # 更新p结点(p结点为子树的根节点)

# push_down
def push_down(p,pl,pr):
    if tag[p]!=0: # 之前对p进行过修改,有懒标记
        mid=(pl+pr)>>1
        addtag(p<<1,pl,mid,tag[p]) # 将懒标记传递给左结点
        addtag(p<<1|1,mid+1,pr,tag[p]) # 将懒标记传递给右结点
        tag[p]=0 # 清空p结点的懒标记

# 2.查询query
def query(p,L,R,pl,pr):
    if L<=pl and R>=pr: # 要查询的区间[L,R]包含了当前的[pl,pr]
        return tree[p] # 返回这个结点的值

    push_down(p,pl,pr) # 向下传递懒标记(一路向下更新结点值)

    mid=(pl+pr)>>1
    ans=0
    if L<=mid:
        ans+=query(p<<1,L,R,pl,mid) # 得到满足条件的左子树的和
    if R>mid:
        ans+=query(p<<1|1,L,R,mid+1,pr) # 得到满足条件的右子树的和
    return ans

# 3.更新update
def update(p,L,R,pl,pr,d): # 将区间[L,R]加上d
    if L<=pl and R>=pr:
        addtag(p,pl,pr,d) # 更新所包含子树的根节点
        return
    mid=(pl+pr)>>1
    if L<=mid:
        update(p<<1,L,R,pl,mid,d)
    if R>mid:
        update(p<<1|1,L,R,mid+1,pr,d)
    tree[p]=tree[p<<1]+tree[p<<1|1]

N,Q=map(int,input().split())
a=[0]+list(map(int,input().split())) # 叶子结点数组(0不存)
tree=[0]*(len(a)<<2) # 线段树
tag=[0]*(len(a)<<2) # 懒标记


build(1,1,N)

res=[]
for _ in range(Q):
    li=list(map(int,input().split()))
    if len(li)==3:
        res.append(query(1,li[1],li[2],1,N))
    elif len(li)==4:
        update(1,li[1],li[2],1,N,li[3])

for i in res:
    print(i)
t(map(int,input().split()))
    if len(li)==3:
        res.append(query(1,li[1],li[2],1,N))
    elif len(li)==4:
        update(1,li[1],li[2],1,N,li[3])

for i in res:
    print(i)


🎇此题为线段树模板题,今天的考点是~🎇

线段树!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试目的是什么?软件测试公司可提供哪些测试服务类型?

随着科技的不断发展&#xff0c;软件行业的发展也越来越迅速。然而&#xff0c;随着软件的增多和复杂性的提高&#xff0c;开发者们需要更多的手段来确保软件质量。软件测试就是通过一系列的测试来发现软件的问题&#xff0c;从而提高软件的质量。 一、软件测试目的是什么? …

【敬伟ps教程】蒙版和通道的基础知识

文章目录 通道通道面板 Alpha 通道通道和选区的关系编辑 Alpha通道原色通道的利用 图层蒙版编辑图层蒙版快速蒙版 通道 通道是图像文件的一种颜色数据信息存储形式&#xff0c;它与图像文件的颜色模式密切相关 多个分色通道(如图:红R、绿G、蓝B)叠加在一起可以组成一幅具有颜…

【UE】制作追踪导弹

效果 步骤 1. 首先在虚幻商城下载所需素材 2. 打开“BP_West_Missile_M26” 勾选模拟物理 添加一个变量&#xff0c;命名为“Target” 该变量用来表示导弹追踪的目标&#xff0c;变量类型为actor的对象引用&#xff0c;勾选可编辑实例和生成时公开 在事件图表中添加如下节点 3…

【JavaSE】Java基础语法(二十七):Set集合和 TreeSet

文章目录 1. Set集合1.1Set集合概述和特点【应用】1.2Set集合的使用【应用】 2.TreeSet集合2.1TreeSet集合概述和特点【应用】2.2TreeSet集合基本使用【应用】2.3自然排序Comparable的使用【应用】2.4比较器排序Comparator的使用【应用】2.4两种比较方式总结 1. Set集合 1.1Se…

CNNs和视觉Transformer:分析与比较

探索视觉Transformer和卷积神经网络&#xff08;CNNs&#xff09;在图像分类任务中的有效性。 图像分类是计算机视觉中的关键任务&#xff0c;在工业、医学影像和农业等各个领域得到广泛应用。卷积神经网络&#xff08;CNNs&#xff09;是该领域的一项重大突破&#xff0c;被广…

springboot+vue高校班级管理系统 java 同学录校友录网站

本海滨学院班级回忆录管理员功能有个人中心&#xff0c;用户信息管理&#xff0c;班委信息管理&#xff0c;班级信息管理&#xff0c;加入班级管理&#xff0c;新闻信息管理&#xff0c;班级相册管理&#xff0c;活动信息管理&#xff0c;捐赠信息管理&#xff0c;论坛信息管理…

司空见惯 - 使用dBm表示功率的各种现实情况

前面一篇文章介绍过&#xff0c;使用dBm表示功率时&#xff0c;如何转换为mW。 那现实世界的实际情况中&#xff0c;使用dBm来表示电磁波的能量强度&#xff0c;列表如下&#xff1a; Power level Power Notes 526 dBm 3.61049 W 黑洞碰撞后的引力波辐射的功率&#xff0c…

Linux上安装jdk Tomcat mysql redis

1.安装JDk 1.1这里使用xshell中xfxp进行文件的上传&#xff0c;将jdk二进制包上传到Linux服务器上 下载地址&#xff1a;Java Downloads | Oracle 或者这里有下载好的安装包&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ZSJxBDzDaTwCH2IG-d2Gig 提取码&#xff1a;…

ChatGPT报错:Sorry, you have been blocked解决方法

今天打开ChatGPT&#xff0c;发现再一次报错了&#xff01; 又一次出问题了。。。。。。。无语&#xff01; 原因分析 1、内容过滤&#xff1a;某些平台或网站可能使用内容过滤系统&#xff0c;该系统可能将AlI语言模型视为潜在的风险&#xff0c;从而对其进行封锁或限制。这…

【Springboot】集成百度地图实现定位打卡功能

目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3.1 环境搭建 3.1.1 获取百度地图ak 3.1.2 创建springboot项目 3.2 配置application.properties 3.3 配置pox.xml 3.4 创建定位接口 3.5 创建前端页面 3.6 映射静态文件 第一章 需求分析 如图&#xff0c;当…

Redis数据类型之列表List

Redis数据类型之列表List list中的命令如下&#xff1a; lpush&#xff1a;从左边插入&#xff0c;插入的数据是倒叙 LPUSH key value1 [value2] 将一个或多个值插入到列表头部 lpush k1 a b c d e f ; 输出结果 f e d c b a lpop k1; 输出 f 从左边pop弹出时先弹出的是f&…

【深度学习】基于Python Qt的口罩检测与报警系统

文章目录 yolov7训练系统集成数据库报警记录查看qt页面跳转方式qt 的数据库某表查看页面如何写q742971636 yolov7训练 yolov7:https://github.com/WongKinYiu/yolov7 人脸口罩数据集&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1bnxJPnoRNwUfVzLxKjIvkQ?pwdc0yc …

《OrangeS一个操作系统的实现》中printf无法打印数字问题

【问题现象】 《OrangeS一个操作系统的实现》 第9章 a目录下的代码编译运行后&#xff0c;所有printf打印数字的地方都有问题&#xff0c;如下图&#xff1a; HD size 始终为 0MB。 【问题分析】 通过断点&#xff0c;发现printf第61行&#xff1a; int printf(const char *…

优化|数学软件是如何求解线性方程Ax=b ?

编者按 对于大家来说&#xff0c;我们从学会多项式开始就得和求解矩阵方程打交道。大学之前靠手算&#xff0c;到了大学阶段我们学会了使用科学计算软件&#xff0c;然后只需要输入简单的一行指令 x A \ b x A \backslash b xA\b&#xff0c;就可以轻轻松松求解方程组 A x …

移动端开发

1. 视口 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, in…

MySQL---SQL优化上(explain分析执行计划、查看SQL的执行效率、定位低效率SQL)

1. 查看SQL的执行效率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当前数据库的主要操作类型。 --下面的命令显示了当前 session 中所有统计参数的值 show session status like Com____…

oracle表空间、用户、表的关系和创建

目录 一、表空间 二、用户 &#xff08;1&#xff09;Oracle和mysql、sqlserver的区别 &#xff08;2&#xff09;创建用户 &#xff08;3&#xff09;给用户授权 三、表 &#xff08;1&#xff09;创建表 &#xff08;2&#xff09;用图像化软件添加表约束 1.主键约束…

【java】leetcode 二叉树展开为链表

二叉树展开为链表 leetcode114 .二叉树展开为链表解题思路二叉树专题&#xff1a; leetcode114 .二叉树展开为链表 114 leetcode 链接。可以打开测试 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#x…

茶润童心 以茶明礼

中国是茶的故乡&#xff0c;也是茶文化的发源地&#xff0c;茶文化也是中国文化的一部分。5月27日下午&#xff0c;8位武汉公益小天使来到中茶恩施硒茶全国运营中心开展少儿茶艺活动。 开场的自我介绍&#xff0c;公益小天使逐个进行自我介绍&#xff0c;喊着“好名字”互相加…

HMM实现中文分词

引言 在隐马尔可夫模型中介绍了HMM的理论部分&#xff0c;为了巩固理论知识&#xff0c;本文基于HMM实现中文分词。具体来说&#xff0c;通过HMM实现基于字级别的分词算法。 HMM 这里简单说明一下&#xff0c;更详细的请参考隐马尔可夫模型。 这里输入序列为 X 1 : N X_{1:N…