线段数
最近leetcode几天每日都是线段数,看来还是逃不掉的...
本质:完全二叉树
⚠️ 构建 查询 修改 都用到了递归
作用
存放区间数据(区间最大最小值、 区间求和、 最大公因数)的二叉树结构
优化 区间的修改、维护、查询方法为 log
级别
操作(类方法)
建树
开内存(L = 4n)
递归构建 左右子节点
def __init__(self):
#...
def build(self, **krawg):
#...
单点修改
从根节点
def chagne(self, **krawg):
# ...
def update(self, i, val):
self.chagne(i, val, **krawg)
区间修改
lazy标记: 区间的值已经更新 但子区间未更新
区间查询
- 查询区间是否覆盖当前区间节点 (
True
: 返回结果False
: 到2) - 查询当前节点的
Left
或Right
与结果是否有交集 (True
: 到1) - 合并结果
查询
- 如果完全覆盖 直接返回
- 如果与左或右子节点有交集 递归查询子节点
def ask2(self): # 上面 覆盖的思想
# ...
def query(self, **krawg):
# ...
def ask(self): # 查询到最后
self.querk((l, r), **krawg)