题目大意:
有一个初始序列,你要维护其3个操作:
1.格式:1 x y k 表示把区间[x,y]乘以k。
2.格式:2 x y k 表示把区间[x,y]加上k。
3.格式:3 x y 表示求区间[x,y]的和。
思路:
标准的线段树模板,蒟蒻打了3小时才过。
解题过程:
线段树是一种灵活的数据结构,在信竞中较为常见。
它的原理是这样的:
上图为区间[1,6]的线段树
序列中的每个元素即为线段树中的叶子节点,在一个子树中父节点=左孩子+右孩子。
所以定义一个结构体:
struct Node{
ll l,r,k;//左孩子,右孩子,值
ll add,mul;//加法和乘法
}tree[N<<2];//N<<2=N*4,线段树空间通常开4倍大
那我们如何建树呢?
上文说了,当节点为孩子节点是便是序列值,所以l==r时就是叶子节点。
所以建树程序如下: