没有合适的资源?快使用搜索试试~ 我知道了~
首页线段树及其应用pptppt
线段树及其应用pptppt

线段树详细应用,自己看 线段树详细应用,自己看 线段树详细应用,自己看 线段树详细应用,自己看 线段树详细应用,自己看
资源详情
资源评论
资源推荐

线段树及其应用
Yali 朱全民

引例 数列操作
假设有一列数 {A
i
}(1≤i≤n) ,支持如下两种操作:
将 A
k
的值加 D 。( k, D 是输入的数)
输出 A
s
+A
s+1
+…+A
t
。( s, t 都是输入的数, S≤T )
输入:第一行一个整数 n ,
第二行为 n 个整数,表示 {A
i
} 的初始值。
第三行为一个整数 m ,表示操作数
下接 m 行,每行描述一个操作,有如下两种情况:
ADD k d ( 表示将 A
k
加 d , 1<=k<=n , d 为整数 )
SUM s t (表示输出 A
s
+…+A
t
)
输出:对于每一个 SUM 提问,输出结果

如果按题目要求直接模拟:
每一个 ADD 操作的复杂度是 O(1)
每一个 SUM 操作的复杂度是 O(N)
可见对于 M 次 SUM 询问,复杂度是 O(NM)
有没有更好的方法呢?这里我们提出一种称
之为线段树的数据结构。
引例 数列操作

引例 线段树的定义
线段树是一棵二叉树,记为 T(a, b) ,参数 a,b 表示区间 [a,b] ,其中
b-a 称为区间的长度,记为 L 。
线段树 T(a,b) 也可递归定义为:
若 L>1 : [a, (a+b) div 2] 为 T 的左儿子;
[(a+b) div 2,b] 为 T 的右儿子。
若 L=1 : T 为叶子节点。
表示区间 [1, 10] 的线段树样例:
[1,10]
[1,5]
[5,10]
[1,3]
[3,5] [5,7] [7,10]
[1,2]
[2,3]
[3,4] [4,5]
[5,6]
[6,7]
[7,8]
[8,10]
[8,9]
[9,10]

引例 线段树的建立
我们知道,对于长度为 n 的线段建立的线段
树,至多只有 nlogn 个节点,故建立线段树
的复杂度是 O(nlogn)
Procedure MakeTree(a,b)
Var Now:Longint
Begin
tot ← tot + 1 Now ← tot
Tree[Now].a ← a Tree[Now].b ← b
If a +1 < b then
Tree[Now].Left ← tot + 1 MakeTree(a, )
Tree[Now].Right ← tot + 1 MakeTree( , b)
End
2/)( ba
2/)( ba
剩余24页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论2