数据结构------线段树2:单点修改与区间询问

简介: 上一次我们讲到线段树的概念和建树,今天,我们来讲线段树的单点修改与区间询问。1.单点修改单点修改会改变它所在子树的节点,当你修改了叶节点后,一定要更新其祖先的值。code:void up(int p){ s[p] = s[p * 2] + s[p * 2 + 1];}//向上更新...

上一次我们讲到线段树的概念和建树,今天,我们来讲线段树的单点修改与区间询问。

1.单点修改

单点修改会改变它所在子树的节点,当你修改了叶节点后,一定要更新其祖先的值。

code:

void up(int p){
    s[p] = s[p * 2] + s[p * 2 + 1];
}//向上更新节点
void modify(int p, int l, int r, int x, int v){//p节点编号,l,r区间,v修改值
    if (l == r){
        s[p] += v;
        return;
    }
    int mid = (l + r) / 2;
    if (x <= mid)
        modify(p * 2, l, mid, x, v);//左子树
    else
        modify(p * 2 + 1, mid + 1, r, x, v);//右子树
    up(p);
}

其实这就是一个模板,记一下,对你有好处!

 

2.区间询问

一般来说,区间询问是以这样的形式出现滴:

给定一个区间 [ l , r ] ,求区间的和。

上图QAQ

线段树:我又回来啦!

 

此时,询问 [ 3 , 6 ]的最小值。

先找3所在的区间 [ 1 , 5 ] ,接着在搜左子树,右子树。直到搜到3。

之后在3~6的区间中,[ 4 , 5 ]是一个节点,直接返回区间最小值,不必往下搜,再到右子树上去搜6,找到总区间最小值。

 1 int query(int p, int l, int r, int x, int y)
 2 {
 3     if (x <= l && r <= y) return s[p];//若该结点被查询区间包含
 4     int mid = (l + r) / 2, res = 0;
 5     if (x <= mid) 
 6     res += query(p * 2, l, mid, x, y);
 7     if (y > mid) 
 8     res += query(p * 2 + 1, mid + 1, r, x, y);
 9     return res;
10 }

这要用到之前的修改

 

这就是线段树的单点修改与区间查询

自己背一背模板,rp++。

 

相关文章
|
8月前
|
存储 人工智能 索引
【数据结构】树状数组和线段树
【数据结构】树状数组和线段树
72 0
【数据结构】做题笔记--区间反转链表
【数据结构】做题笔记--区间反转链表
|
8月前
|
算法 索引 Python
Python高级数据结构——线段树(Segment Tree)
Python高级数据结构——线段树(Segment Tree)
306 2
|
存储 人工智能
高级数据结构-线段树
线段树树基于分治思想的二叉树,用来维护区间信息(区间和、区间最大值、区间最小值等等)。可以在 O(logn) 的时间内完成区间信息的查询和修改。
76 0
高级数据结构-线段树
数据结构:线段树代码详解
数据结构:线段树代码详解
92 0
数据结构:线段树代码详解
|
存储
【数据结构】线段树(入门)
【数据结构】线段树(入门)
90 0
【数据结构】线段树(入门)
|
存储 人工智能 索引
【数据结构】了解线段树与操作线段树的基本方法
【数据结构】了解线段树与操作线段树的基本方法
【数据结构】了解线段树与操作线段树的基本方法
|
存储 移动开发 算法
【愚公系列】2021年11月 C#版 数据结构与算法解析(线段树)
【愚公系列】2021年11月 C#版 数据结构与算法解析(线段树)
141 0
【愚公系列】2021年11月 C#版 数据结构与算法解析(线段树)

热门文章

最新文章