#include <bits/stdc++.h>
#define int long long
const int maxn=1e5+5;
using namespace std;
typedef struct tree
{
int l,r,sum,add,len;//l,r区间左右界,sum是维护的区间和,add是懒惰标记,len是区间长度
} tr;
tr tree[maxn<<2];
void pushup(int p)//上传更新维护根结点的值
{
tree[p].sum=(tree[p<<1].sum+tree[p<<1|1].sum)%mod;
}
void pushdown(int p)//下传懒惰标记更新子区间的值
{
if(!tree[p].add)
return;//如果没有懒惰标记就不用下传了
//子树的sum值=原来的sum值+其根结点的懒惰标记记录的每个数要加的值*该子树所示区间的长度
//(懒惰标记记录的每个数要加的值*该子树所示区间的长度)即该区间要加的总的值
tree[p<<1].sum=(tree[p<<1].sum+tree[p<<1].len*tree[p].add)%mod;
//子树的标记值=原来的标记值+其根结点下传的标记值
tree[p<<1].add=(tree[p<<1].add+tree[p].add)%mod;
tree[p<<1|1].sum=(tree[p<<1|1].sum+tree[p<<1|1].len*tree[p].add)%mod;
tree[p<<1|1].add=(tree[p<<1|1].add+tree[p].add)%mod;
t
线段树的区间修改模板(含懒惰标记)
最新推荐文章于 2020-04-04 18:32:41 发布