#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 + r)/2;
build(l, mid, p * 2);
build(mid + 1, r, p * 2 + 1);
tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
}
void update(ll l, ll r, ll d, ll p , ll cl , ll cr )
{
if(cl >= l && cr <= r)//l,r是修改的区间,cl,cr是待询问的区间
{
tree[p] += (cr-cl+1) d;
//修改完对应的整段区间的值
if (cr > cl)mark[p] += d;
//cr=cl当且仅当在线段树的叶子节点,这里是没有必要更新懒标记的
//因为懒标记的作用就是暂且打上一个标记,方便为后续节点修改
//给这段区间打上标记 只有完全包含在这段区间之内才打上标记
//打上标记就意味着以该节点为根的所有叶子节点都进行了操作
else
//不更新这整段区间,而是要拿出来区间的一部分
{
ll mid =(cl + cr) / 2;
push_down(p, cr - cl + 1);
//p对应着相应的cl,cr
//这里就不能给p打上相应的lazy了,因为不是修改p所对应的cl,cr这一整段,而是其中的一部分
if(mid>=l)update(l, r, d, p * 2, cl, mid);
if(mid<r)update(l, r, d, p * 2 + 1, mid + 1, cr);
tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
}
ll query(ll l, ll r, ll p , ll cl , ll cr )
{
if(cl >= l && cr <= r)//所查询的区间在待查询的区间内部
return tree[p];
else//与update一样,不查询这整段区间,而是查询这区间的一部分
{ ll ans= 0 ;
ll mid = (cl + cr) / 2;
push_down(p, cr - cl + 1);
if(mid>=l)ans+=query(l, r, p * 2, cl, mid);
if(mid<r)ans+=query(l, r, p * 2 + 1, mid + 1, cr);
return ans;
}
}
int main()
{ ll n ,q,t;
scanf("%lld",&t);
for(ll w=1 ;w<=t;w++)
{
memset(mark,0,sizeof mark);
scanf("%lld%lld",&n,&q);
build(1,n,1);
for(int i=1 ;i<=q;i++)
{
ll s;
scanf("%lld",&s);
if(s1)
{
ll l ,r ;
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(l,r,1,1,n));
}
if(s0)
{
ll l,r,val;
scanf("%lld%lld%lld",&l,&r,&val);
update(l, r, val,1,1,n);
}
}
}
return 0;
}
线段树区间、单点修改查询模板,以及自己对线段树的理解
最新推荐文章于 2024-08-20 16:58:30 发布