#include
#include
#include
#include
#define MAXN 300005
using namespace std;
typedef long long ll;
//线段树其实就是一棵二叉搜索树
//lazy就是说mark懒标记,私以为,线段树的精髓就在这个懒标记上
//正是因为lazy的存在,使得区间修改不用投射到对应的每一个节点上,
//才使得修改实现了log级别
ll n, m, a[MAXN], tree[MAXN4], mark[MAXN4];
void push_down(ll p, ll len)
//pushdown操作就是将懒标记下放,本质上是因为这段区间需要取出一部分来
//要获得取出的那一部分的具体信息,原先应该对应修改的信息被暂存在它的前驱节点的lazy上
//因此要下放过去。
{ if(mark[p])
{
mark[p * 2] += mark[p];
mark[p * 2 + 1] += mark[p];
tree[p * 2] += mark[p](len - len / 2);//len是奇数的话,就是mid+1,与建树一致
tree[p * 2 + 1]+= mark[p] * (len / 2);
mark[p] = 0;
}
}
void build(ll l ,ll r,ll p)
//建线段树便是初始化节点的过程
{
if(l == r)
tree[p] = 0;
else
{
ll mid=(l +
线段树区间、单点修改查询模板,以及自己对线段树的理解
最新推荐文章于 2023-07-29 20:09:22 发布