线段树
如果区间信息、标记能够快速合并,可以用线段树
基本储存及实现
储存
封装信息,用info记录存储的信息
后续给val赋值时可使用seg[i].val = {值1,值2…}的形式
typedef long long ll;
const int N = 201000;
struct info {
int minv;
}
struct node {
info val;
} seg[N * 4];
重载加号,确定信息修改规则
info operator + (const info &l, const info &r) {
info a;
a.minv = min(l. minv, r.minv);
return a;
}
这样修改的时候只需要在info里增加变量,在重载里增加信息修改规则就可以了
操作
build() ---- 递归建树
//结点是id,区间是[l, r]
void build(int id, int l, int r) {
if (l == r) {
seg[id].val = {a[l]};
} else {
int mid = (l + r) / 2;
build(id * 2, l , mid);
build(id * 2 + 1, mid + 1, r);
update(id);
}
}
update() ---- 根据左

本文详细介绍了线段树这一数据结构,包括其基本储存、实现方式、操作方法如build、change、query等,并展示了如何扩展线段树以存储更多信息,如区间最小值和出现次数。此外,还讲解了线段树的标记系统,如何进行区间修改和查询,并给出了线段树上二分查找的例子。内容深入浅出,适合对数据结构感兴趣的读者学习。
最低0.47元/天 解锁文章
532

被折叠的 条评论
为什么被折叠?



