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

news2024/11/23 15:31:21

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



🚀 每日一题,冲刺国赛 🚀

在这里插入图片描述


题目导航:

区间修改、区间查询

在这里插入图片描述


🎇思路:线段树

🔱思路分析:

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

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)


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

线段树!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.2密码应用基本要求与实现要点

4.2.1 标准介绍 2018年2月8日&#xff0c;GM/T0054-2018《信息系统密码应用基本要求》由国家密码 管理局发布并实施。 ① 总体要求规定了密码算法、密码技术、密码产品和密码服务应当符合商用密码管理的相关规定&#xff0c;满足标准规范的相关要求&#xff0c;即合规性。 ②密…

校园综合能效管理平台建设的意义

摘要&#xff1a;为响应国家绿色校园建设的号召&#xff0c;切实提高高校能源利用水平&#xff0c;推动学校能源资源合理配置&#xff0c;服务学校高质量发展大局&#xff0c;根据教育部印发的《关于开展节能减排学校行动的通知》《关于勤俭节约办教育建设节约型校园的通知》《…

ESP8285 多个bin文件合并烧录

可通过两种方式烧录固件&#xff0c;一种是基于esp-idf开发时&#xff0c;中命令终端执行make flash命令烧录&#xff1b;二是使用ESPFlashDownloadTool工具。 bin文件说明 ESP8285/ESP8266的固件一般包含4个bin文件。 查看各bin文件的路径 以带OTA的固件为例&#xff0c;在…

chatgpt赋能python:Python中的乘方操作

Python中的乘方操作 作为一种流行的编程语言&#xff0c;Python内置了许多强大的数学运算工具。其中&#xff0c;乘方操作是一个非常常见的数学操作&#xff0c;它可以快速地计算一个数的任意次幂。本文将介绍Python中乘方操作的用法&#xff0c;并提供了一些相关的示例代码。…

Git服务器集成 · GitHub 服务器(二)

本篇文章旨在分享本人在学习Git时的随笔记&#x1f929; 文章目录 1、注册账号2、创建新的仓库3、本地仓库的基本操作指令4、SSH 免密操作4.1、本地生成 SSH 密钥4.2、集成用户公钥 5、设定全局用户6、创建本地库以远程地址7、新增&#xff0c;提交本地仓库文件8、推送到 GitHu…

某马大数据全套视频

某马大数据 需要的私信&#xff1a;某马大数据 01、阶段一 Python大数据开发基础 01、第一章大数据介绍及开发环境 02、第二章 linux命令 03、第三章 MySQL数据库 04、第四章 excel的使用 05、第五章 kettle的使用 06、第六章 数据分析及可视化 07、第七章 大数据框架与…

修改gd32f305时钟

如题&#xff0c;移植GD32F305芯片驱动&#xff0c;修改时钟的方法。 硬件外部时钟为8MHz&#xff0c;官方demo文件为25MHz&#xff0c;基于此修改时钟配置。 1、选择system_gd32f30x.c并修改 如下图 1.1&#xff09;注意查看 __HXTAL 的时钟是否为硬件电路对应的实际大小。…

2023 华为 Datacom-HCIE 真题题库 11--含解析

单项选择题 1.[试题编号&#xff1a;190685] &#xff08;单选题&#xff09;通过iMasterNCE-Campus部署的虚拟化园区网络场景中&#xff0c;以下关于“添加设备”的描述中&#xff0c;错误的是哪一项&#xff1f; A、IMaster NCE-Campus支持通过设备角色添加设备 B、IMaster …

概率论:样本与总体分布,Z分数与概率

参考书目&#xff1a;《行为科学统计精要》&#xff08;第八版&#xff09;——弗雷德里克J格雷维特 数据及其样本的分布 描述一组数据分布 描述一组样本数据的分布 描述样本数据的均值和整体数据一样&#xff0c;但是样本标准差的公式除以了n-1&#xff0c;这里引入自由度的…

DAY05_Maven

目录 1 Maven1.1 Maven简介 2 Maven安装配置2.1 下载2.2 配置maven的环境变量2.3 MavenSetting.xml文件配置2.4 检测 3 Maven基本使用3.1 Maven常用命令3.2 Maven生命周期3.2.1 default 构建生命周期 4 IDEA配置Maven4.1 IDEA配置 Maven 环境4.2 Maven 坐标详解4.3 IDEA 创建 M…

优漫动游:ui设计面试问题及答案?

ui设计面试问题及答案&#xff1f;面试是每个大学生都会遇到的一种求职形式&#xff0c;尤其是对于一些不太了解面试的同学来说。那么面试中的问题究竟有哪些呢&#xff1f;这些问题到底有没有标准答案呢&#xff1f;本文优漫小编就来给大家分享一下关于UI设计面试中的几个问题…

Spring事务简介案例

文章目录 1.Spring事务简介2.案例3.步骤3.1 添加注解Transactional3.2 定义事务管理器3.3 EnableTransactionManagement开启事务驱动 1.Spring事务简介 可以在业务层上开的一种事务&#xff0c;开在业务层上的好处是&#xff0c;可以将业务层中方法里面所包含的数据层操作放到…

【学习心得】Linux下的Python虚拟环境搭建

问题描述&#xff1a;本文解决在Linux系统&#xff08;Ubuntu举例&#xff09;中如何实现Python的多版本以及搭建Python虚拟环境。 一、Linux系统中实现Python多版本 1、第一步&#xff1a;在官网中找到对应Python版本的tar压缩包的下载链接。 在历史版本中找到你想要的Pytho…

实验篇(7.2) 03. 部署物理实验环境(下)❀ 远程访问

【简介】考虑到有很多人初次接触FortiGate防火墙硬件&#xff0c;因此在讲解部署物理实验环境的时候&#xff0c;防火墙的初次登录内容介绍的比较多&#xff0c;以致于需要将文章分下、下二篇。下篇我们重点介绍服务器的配置及部署。 防火墙的接口规划 在部署服务器之前&#x…

基于MCGS嵌入版组态软件的船舶绝缘在线监测装置

关注acrelzxz&#xff0c;了解更多详细内容 摘要:针对船舶供电系统电缆的绝缘状态问题&#xff0c;设计了一款电缆绝缘在线监测装置。装置采用低频交流注入法&#xff0c;在IT系统的中心点注入低频的交流信号&#xff0c;通过取样电路和A/D量化检测注入信号在电路中的响应&…

加密与解密 调试篇 动态调试技术 (二)-常见断点

目录 常见的断点 1.INT 3 断点 检测 绕过 2.硬件断点 原理 我们给出硬件中断的例子 删除硬件断点 3.内存断点 原理 例子 删除 区别 总结 4.内存访问一次性断点 5.消息断点 例子 删除 6.条件断点 &#xff08;1&#xff09;按寄存器条件中断 &#xff08;2&…

渠道投放数据建设

广告投放渠道识别方式 1、渠道包&#xff1a;每个渠道分配不同的渠道包&#xff0c;用户下载APP之后根据他下载的是哪个渠道包来识别渠道来源&#xff0c;比较常见于应用商店的投放。但是需要注意渠道包可能会导致作弊情况&#xff0c;例如用虚拟机下载渠道包来模拟下载数据等…

Linux介绍和vm17pro安装 和Centos以及vm简单操作

Linux 介绍 概述 linux 怎么读&#xff0c; 不下10 种linux 是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发已经得到业界的认可&#xff0c;目前很多企业级的项目(c/c/php/python/java/go)都会部署到Linux/unix 系统上。常见的操作系统(windows、IOS、…

ChatGPT工作提效之使用百度地图在首都为六一儿童节献爱心(多边形覆盖物、文本标注、自动获取经纬度、爱心函数)

ChatGPT工作提效系列 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对接解决方…

浏览器跨域的配置

目录 1、前言 2、同源策略 3、跨源数据存储访问 4、浏览器跨域设置 4.1 版本号&#xff08;49.x.x.x.x&#xff09;之前的跨域设置 4.2 版本号&#xff08;49.x.x.x.x&#xff09;之后的跨域设置 5、批处理跨域设置 5.1 windows 操作系统。 5.2 Mac 操作系统 1、前言 …