线段树模板题,主要对懒标的处理要求比较高。
有三种操作:
- 区间加法
- 区间乘法
- 区间求和查询
tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown,这时候,加法lazy和乘法lazy都需要乘k。因为这个lazy是为儿子节点准备的,儿子还没进行加法操作,这次的乘法肯定也会作用于前面的加法。
另外,线段树的一些基本知识点漏洞这次也暴露了出来: pushdown操作,我们知道,每个结点的懒标都是为儿子结点准备的,所以在查询/修改到x结点的时候不需要pushdown,即将查询/修改x的儿子结点的时候才需要pushdown。
AC代码:
long long a[100010];
long long mod;
long long n, m;
struct node
{
long long k, l, r, sum, lazy1, lazy2; //lazy1 乘法懒标,lazy2加法懒标
} tr[400040];
void update(long long k)
{
tr[k].sum = (tr[k * 2].sum + tr[k * 2 + 1].sum) % mod;
}
void build(long long k, long long l, long long r)
{
tr[k].l = l;
tr[k].r = r;
tr[k].lazy1 = 1;
tr[k].lazy2 = 0;
if (tr[k].l == tr[k].r)
{
tr[k].sum = a[l] % mod;
return;
}
long long mid = l + r >> 1;
build(k * 2, l, mid);
build(k * 2 + 1, mid + 1, r);
update(k);
}
inline void pushdown(long long k)
{
tr[k * 2].sum = (tr[k * 2

最低0.47元/天 解锁文章
1059

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



