C++线段树区间乘法&区间加法&区间查询代码详解(可能是最详细的了)

本文详细介绍了C++实现线段树进行区间乘法、加法及查询的原理和代码,特别解析了push_down函数的实现,包括如何处理乘法和加法的懒惰标记,以及如何维护区间和。适合初学者学习和理解线段树的核心操作。
摘要由CSDN通过智能技术生成

当我刚刚接触线段树区间乘法时,因为一直没想懂乘法和加法的懒标记怎么一起下推,上百度和CSDN搜索程序讲解,但搜到的绝大多数都是一些没有讲解,直挂代码的博文,很难让人看懂代码意思,往往会花费大量时间在理解变量的作用和操作的原理,因此为了方便初学者学习(也为了方便我以后复习),就写了这篇博文,希望对你有所帮助!

题目:

代码解释:

代码虽然长,但原理简单

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll a[100001],tree[400001],mark[400001],mark_[400001],n,m,M; //a用来存原数组的值,tree用来维护线段树,mark用来记录加法的懒标记
                                                            //mark_用来记录乘法的懒标记,M是需要取模的数值
inline void read(ll &a) {
     //快读
	ll x(0),y(1);char c=getchar();
	while(c<'0'||c>'9') {
   
		if(c=='-')y=-1;c=getchar();
	}
	while(c>='0'&&c<='9') {
   
		x=(x<<1)+(x<<3)+(c^48);c=getchar();
	}
	a=x*y;return;
}
inline void write(ll x) {
     //快输
	if(x<0) {
   
		putchar('-');x=-x;write(x);
	} else {
   
		if(x>9)
			write(x/10);
		putchar(x%10+'0');
	}
}

push_dawn函数:

push_dawn函数是程序的核心,主要作用是把加法和乘法标记下推,并维护左右子树的值,下面会对此函数进行详细解释

第一个部分:左右子树数值维护

首先,因为子树同时有乘法的标记和加法的标记,我们需要一起处理

先说乘法:

因为乘法是把从 l l l r r r 的所有数乘以 k k k 所以可以得到如下公式:

a l + a l + 1 + . . . + a r = a l × k + a l + 1 × k + . . . + a r × k a_l+a_{l+1}+...+a_r=a_l×k+a_{l+1}×k+...+a_r×k al+al+1+...+ar=al×k+al+1×k+...+ar×k

提取公因式:

a l × k + a l + 1 × k + . . . + a r × k = k × ( a l + a l + 1 + . . . + a r ) a_l×k+a_{l+1}×k+...+a_r×k=k×(a_l+a_{l+1}+...+a_r) al×k+al+1×k+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值