线段树入门小结

QUE:线段树?

  • 称谓

从刘汝佳的书中得知,“这种数据结构在学术界没有统一的术语,但线段树是最常见的叫法。其他叫法包括区间树(interval
tree)、范围树(range
tree)等,但这些属于在特定的场合(如计算几何)中有着特殊的意义”。怎么叫看读者的心情,以下统一用线段树称呼。

  • 先来作一些了解:

线段树是一棵二叉树,它的左右儿子也都是一棵线段树。(定义)

线段树也叫区间树,为什么叫它区间树呢?因为线段树是一种基于区间的数据结构。

线段树的每个节点代表一个区间
[L,R],其中存储的是这个区间的特定值

例如RMQ(Range Minimum/Maximum
Query,范围最大/最小值)问题,给出n个元素的数组,查询任意区间内的元素最大/最小值。

这个问题就是基于区间查询的,需要用到线段树,而它节点中存储的特定值就是所代表区间的最大/最小值。

某个节点代表区间 [L,R],其两个儿子节点代表区间分别为
[L,mid],[mid+1,R]( mid = (L+R)/2 )。

  • 线段树的操作

1、点修改

在[L,R]中修改[LL,RR](LL=RR)的时候有两种情况。

第一种,[LL,RR]被[L,mid]包含,此时直接在[L,mid]中修改[LL,RR]

第二种,[LL,RR]被[mid+1,R]包含,此时直接在[mid+1,R]中修改[LL,RR](同理)

然后递归更新父亲。

不用考虑被截断(因为只是一个点)。

2、区间修改

在[L,R]中修改[LL,RR](LL<RR)的时候有三种情况。

第一种,[LL,RR]被[L,mid]包含,此时直接在[L,mid]中修改[LL,RR]

第二种,[LL,RR]被[mid+1,R]包含,此时直接在[mid+1,R]中修改[LL,RR](同理)

第三种,较复杂的一种,[LL,RR]被mid从中截断,此时在[L,mid]中修改[LL,mid],在[mid+1,R]中修改[mid+1,RR],然后将两个查询得到的结果进行update,递归更新父亲。

这样便处理完了修改。

  • 线段树的应用

RMQ问题,存储值,优化DP。

SUM:线段树和树状数组的联系与区别?


两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.
树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能够解决的问题树状数组未必能够解决.
树状数组的突出特点是其编程的极端简洁性, 使用lowbit技术可以在很短的几步操作中完成树状数组的核心操作,与之相关的便是其代码效率远高于线段树。
另外,当问题推广到高维情形时高维树状数组有高维线段树所无法企及的常数优势。

Freecode : www.cnblogs.com/yym2013

线段树入门小结,布布扣,bubuko.com

时间: 2024-12-26 01:23:03

线段树入门小结的相关文章

线段树入门(Billboard)

Billboard Time Limit:8000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description At the entrance to the university, there is a huge rectangular billboard of size h*w (h is its height and w is its width). The board is the place where

线段树入门(I Hate It)

I Hate It Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,

《数据结构》线段树入门(二)

今天继续介绍——线段树之延迟标记 接上期<数据结构>线段树入门(一):http://www.cnblogs.com/shadowland/p/5870339.html 在上期介绍了线段树的最基本内容(线段树单点修改,区间查询),这次将介绍:区间修改,区间查询. Question: 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述: 第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,每行表示操作的个数,如果第一数是1,后接3个正

线段树入门理解

在复习算法至分治法时,书本上主要介绍了合并排序和快速排序,较为简单.特拓展简单学习一个应用了分治法的算法结构--线段树. acm刷题时遇到许多连续区间的动态查询问题,例如求取某一区间上元素之和.求取某一区间上元素的最大值,此时如果使用一般的方法求解会使得时间超出要求.此时需要使用到线段树,其主要用于高效解决连续区间的动态查询问题. 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN),从而大大减少耗时

hdu1166敌兵布阵&amp;&amp;hdu1754I Hate It(线段树入门)

单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来. http://acm.hdu.edu.cn/showproblem.php?pid=1166 update单点更新,query区域求和. #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 200001 using namespace std; s

hdu 1754 I Hate It(线段树入门)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41510    Accepted Submission(s): 16458 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师

线段树入门(更新单个节点)

很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目. 学生ID编号分别从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,

线段树入门---给定多个线段求点的出现个数

线段树是一颗二叉树,他的每个节点都是一个区间,此题为线段树的入门题目,只是学习笔记.例题:给定N个线段,给定M个点,求点在多少个线段中出现过,此时如果用传统的方法来求,时间复杂度太高,但是,线段树的时间复杂度还可以接受. 步骤为: 1. 首先找一个区间,能覆盖给定的所有区间, 然后把此区间建立线段树,建立线段树的方式是二分法建立,即它的左孩子是他的左半个区间,右孩子是它的右边那个区间.一个图足以说明清楚 2. 将所有的区间映射到此树上, 从根节点开始遍历, 每遍历一个节点考虑四种情况: 1) 当

线段树入门题 hdu1166 敌兵布阵

题意:动态查询一段区间的和,支持单点更新. 开始刷线段树了,这是入门第一题...最基本的线段树操作,递归建树,递归查询,递归修改,向上更新节点,每个节点的值代表该节点对应区间的和 . 代码: