线段树-点修区查

翻博客的时候突然发现线段树好像一个没有,我就准备把线段树给讲一下

分三个章节

点修区查

区修区查

区修区查(带乘法)

今天这一章比较简单,最多就区查稍微要动一点脑子

题目简介

输入n和m,n代表数的个数,m代表查询次数

接下来输入n个数,第i的数的值为a[i]

然后是m次查询,每次查询输入三个数op,x,y

当op为1时,表示将第x个数加上y

当op为2时,表示求x到y的区间和

今天的代码大概就是实现这么个功能

首先来看建树

我们开一个结构体用来存线段树,里面有三个变量

ans,l,r

l和r表示的是当前区间的左边界和右边界,ans存的就是区间和

这么说可能有点不清楚

我们画个图

借助上面这个图,大概能知道线段树的构造

而我们也知道,一颗二叉树由左至右依次从一开始标记数字,一个点x的左孩子编号为2*x,而右孩子为2*x+1,因此,我们可以大致推出线段树的建树代码

void build(int p,int l,int r){f[p]={a[l],l,r};//存储当前点if(l==r)return;//如果到了叶子结点,就returnint mid=(l+r)>>1;//中分,分出左右子树build(lc,l,mid);//遍历左子树build(rc,mid+1,r);//遍历右子树f[p].ans=f[lc].ans+f[rc].ans;//求和
}

 然后这里的lc和rc刚刚上面已经说了,分别是2*p和2*p+1

#define lc p<<1
#define rc p<<1|1

树建完了,我们再来看点修

我们要修改的点,肯定是原数组中的点,所以在这颗线段树里一定是叶子结点,因为不是叶子的点都存储的是区间和。

而叶子结点又有一个特点,因为它只有一位,所以左边界和右边界的值是一样的,这样一来就很好判断了。

只要遍历到的当前点左边界是x,右边界也是x,就可以确定它是我们要修改的点,修改它之后,在按照建树的方法,中分,求区间和,进行向上修改就行了

void change(int p,int x,int k){if(f[p].l==x&&f[p].r==x){f[p].ans+=k;return;}int mid=f[p].l+f[p].r>>1;if(mid<x)change(rc,x,k);if(mid>=x)change(lc,x,k);f[p].ans=f[lc].ans+f[rc].ans;//向上修改区间和
}

这里说一下,就是中间两个if语句,是用来精确范围的,如果小了,就往大的找,如果大了,就往小的找,总会找到x的

好的,下面就是最后一项,区间查询了

我们求的任何区间,只要在范围内,都是可以用线段树中的元素拼凑出来的

就拿上面那个图来举例,1-2的区间直接可以得到,1-3的区间则可以用1-2的区间加3得到

所以,我们可以得出结论,求区间和,只需要遍历线段树,只要遍历到的点代表的区间被完全包含,就直接加上这个区间的和,当然,这种方法是不会出现重复的啦

然后强调一下这里精确范围的条件

首先还是中分得到mid

如果mid比 L 大,就要往左边靠,直到贴到L为止

反之,如果mid小于R,就要往右边靠

区查的代码放下面了

int out(int p,int l,int r){if(f[p].l>=l&&f[p].r<=r){return f[p].ans;}int ans=0;int mid=f[p].l+f[p].r>>1;//记得在靠的同时记录区间和,不然就废了if(l<=mid)ans+=out(lc,l,r);if(r>mid)ans+=out(rc,l,r);return ans;
}

现在核心代码都出示在这里了,拼拼凑凑就可以实现了

#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define int long long
using namespace std;
const int N=1e6+5;
int a[N];
struct node{int ans,l,r;
}f[4*N];
int n,m;
void build(int p,int l,int r){f[p]={a[l],l,r};if(l==r)return;int mid=(l+r)>>1;build(lc,l,mid);build(rc,mid+1,r);f[p].ans=f[lc].ans+f[rc].ans;
}
int out(int p,int l,int r){if(f[p].l>=l&&f[p].r<=r){return f[p].ans;}int ans=0;int mid=f[p].l+f[p].r>>1;if(l<=mid)ans+=out(lc,l,r);if(r>mid)ans+=out(rc,l,r);return ans;
}
void change(int p,int x,int k){if(f[p].l==x&&f[p].r==x){f[p].ans+=k;return;}int mid=f[p].l+f[p].r>>1;if(mid<x)change(rc,x,k);if(mid>=x)change(lc,x,k);f[p].ans=f[lc].ans+f[rc].ans;
}
signed main(){scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);build(1,1,n);while(m--){int op;scanf("%lld",&op);int a,b;scanf("%lld%lld",&a,&b);if(op==1){change(1,a,b);}else{printf("%lld\n",out(1,a,b));}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读软件开发安全之道:概念、设计与实施05模式(上)

1. 模式 1.1. 模式分类 1.1.1. 设计属性 1.1.2. 暴露最少信息 1.1.3. 冗余 1.1.4. 强力执行 1.1.5. 信任与责任 1.1.6. 反模式 1.2. 模式可以缓解或者避免很多种类的风险&#xff0c;它们可以形成一个重要的工具箱&#xff0c;帮我们解决潜在的安全威胁 1.3. 不需要为…

学习设置echarts 折线图使用相关参数的方法整理

学习设置echarts 折线图使用相关参数的方法整理 折线图堆叠设置为不堆叠的方法 折线图堆叠设置为不堆叠的方法 官网是这样的&#xff0c;但是不需要这种堆叠形式的如下图&#xff1a; 第2条数据值 第1条数据值 第2条数据值 第3条数据值 第2条数据值 第3条数据值 需要改成…

C语言高手参考手册:函数进阶技巧

[大师C语言]合集&#xff3b;大师C语言(第一篇)&#xff3d;C语言栈溢出背后的秘密&#xff3b;大师C语言(第二十五篇)&#xff3d;C语言字符串探秘&#xff3b;大师C语言(第二篇)&#xff3d;C语言main函数背后的秘密&#xff3b;大师C语言(第二十六篇)&#xff3d;C语言结构体…

汽车管理 API 接口:开启高效车辆运营新时代

API&#xff08;Application Programming Interface&#xff09;是一种接口&#xff0c;用于不同软件之间的通信。在汽车管理领域&#xff0c;API的应用可以帮助提升车辆运营的效率&#xff0c;让车主和车辆管理者更方便地获取车辆相关信息&#xff0c;进行保养和维修等工作。本…

Linux yum提示Error downloading packages

很明显的错误&#xff0c;没有考虑过磁盘空间&#xff0c;记录一下。 Error downloading packages:gcc-4.8.5-44.el7.x86_64: Insufficient space in download directory /var/cache/yum/x86_64/7/base/packages* free 0 * needed 16 M使用du查看当前目录下所有文件大小 du …

黑马头条vue2.0项目实战(十一)——功能优化(组件缓存、响应拦截器、路由跳转与权限管理)

1. 组件缓存 1.1 介绍 先来看一个问题&#xff1f; 从首页切换到我的&#xff0c;再从我的回到首页&#xff0c;我们发现首页重新渲染原来的状态没有了。 首先&#xff0c;这是正常的状态&#xff0c;并非问题&#xff0c;路由在切换的时候会销毁切出去的页面组件&#xff…

HBase原理和操作

目录 一、HBase在Zookeeper中的存储元数据信息集群状态信息 二、HBase的操作Web Console命令行操作 三、HBase中数据的保存过程 一、HBase在Zookeeper中的存储 元数据信息 HBase的元数据信息是HBase集群运行所必需的关键数据&#xff0c;它存储在Zookeeper的"/hbase&quo…

数据结构——链式队列和循环队列

目录 引言 队列的定义 队列的分类 1.单链表实现 2.数组实现 队列的功能 队列的声明 1.链式队列 2.循环队列 队列的功能实现 1.队列初始化 (1)链式队列 (2)循环队列 (3)复杂度分析 2.判断队列是否为空 (1)链式队列 (2)循环队列 (3)复杂度分析 3.判断队列是否…

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

【具体数学 Concrete Mathematics】1.1.2 平面上的直线

Django 第一课 -- 简介

目录 一. 基本介绍 二. 特点 三. MVC 与 MTV 模型 3.1. MVC 模型 3.2. MTV 模型 一. 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 Django 是一个高级的 Python Web 框架&#xff0c;用于快速开发可维护和可扩展的 Web 应用程序。 使用 Dja…

计算机毕业设计Python深度学习房价预测 房价可视化 链家爬虫 房源爬虫 房源可视化 卷积神经网络 大数据毕业设计 机器学习 人工智能 AI

基于python一/二手房数据爬虫分析预测系统可视化 商品房数据Flask框架&#xff08;附源码&#xff09; 项目介绍 技术栈&#xff1a; python语言、Flask框架、MySQL数据库、Echarts可视化 sklearn机器学习 多元线性回归预测模型、requests爬虫框架 链家一手房 一手房数据商品房…

docker连接宿主机redis,提示Connection refused

目录 一、测试环境 二、问题现象 三、问题总结 一、测试环境 centos 7 redis-5.0.14 docker-26.0.1 二、问题现象 服务器重启后docker连接宿主机redis&#xff0c;提示Connection refused Reconnecting, last destination was /172.25.xxx.x:6379 …

VMware vSphere Client无法访问和连接ESXi虚拟主机解决思路

文章目录 前言1. 问题现象2. 问题原因3. 解决方法4. 参考文章 前言 注意 : 可以先看看参考文章那里&#xff0c;在回过来看 1 、 2 、3 1. 问题现象 版本&#xff1a;VMware vCenter Server 5.5.0 build-2442329 问题描述&#xff1a;用VMware vSphere Client 登录ESXI主机出…

状态压缩、记忆化搜索---蒙德里安的梦想

291. 蒙德里安的梦想 - AcWing题库 求把 NMNM 的棋盘分割成若干个 1212 的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0c;M4N2&#xff0c;M4 时&#xff0c;共有 55 种方案。当 N2&#xff0c;M3N2&#xff0c;M3 时&#xff0c;共有 33 种方案。 如下图所示&…

[数据集][目标检测]瞳孔虹膜检测数据集VOC+YOLO格式8768张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8768 标注数量(xml文件个数)&#xff1a;8768 标注数量(txt文件个数)&#xff1a;8768 标注…

【微信小程序】自定义组件 - 数据、方法和属性

1. data 数据 2. methods 方法 在小程序组件中&#xff0c;事件处理函数和自定义方法需要定义到 methods 节点中&#xff0c;示例代码如下&#xff1a; 3. properties 属性 在小程序组件中&#xff0c;properties 是组件的对外属性&#xff0c;用来接收外界传递到组件中的数…

[Algorithm][贪心][跳跃游戏][加油站][单调递增的数字][坏了的计算器]详细讲解

目录 1.跳跃游戏1.题目链接2.算法思路详解3.代码实现 2.加油站1.题目链接2.算法原理详解3.代码实现 3.单调递增的数字1.题目链接2.算法原理详解3.代码实现 4.坏了的计算器1.代码实现2.算法原理详解3.代码实现 1.跳跃游戏 1.题目链接 跳跃游戏 2.算法思路详解 贪心&#xff1…

记忆化搜索与状态压缩:优化递归与动态规划的利器

记忆化搜索是解决递归和动态规划问题的一种高效优化技术。它结合了递归的灵活性和动态规划的缓存思想&#xff0c;通过保存已经计算过的子问题结果&#xff0c;避免了重复计算&#xff0c;大幅提升了算法的效率。当问题状态复杂时&#xff0c;状态压缩技术可以进一步优化空间使…

Java数组05:Arrays类

本节内容视频链接&#xff1a;Java数组07&#xff1a;Arrays类讲解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p57&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌Array类是一个针对数组进行操作的工具类&#xff0c;‌提供了排序、‌…

算法_字符串专题---持续更新

文章目录 前言最长公共前缀题目要求题目解析代码如下 最长回文子串题目要求题目解析代码如下 二进制求和题目要求题目解析 字符串相乘题目要求题目解析代码如下 前言 本文将会向你介绍有关字符串的相关题目&#xff1a;最长公共前缀、最长回文子串、二进制求和、字符串相乘。本…