洛谷 - P13982 数列分块入门 7(线段树解法 - 超详细版)
题目链接:
洛谷P13982 数列分块入门 7
哈喽,大家好,我们见面啦(看到这篇博客的同学能不能给个关注啊)。
今天我们来讲 洛谷P13982 数列分块入门 7。
其实就是 线段树2 的双倍经验啦。
警示后人在本文最后面,没有通过的小伙伴可以看一下。
题目描述:
题目背景
洛谷的数列分块入门系列的测试数据范围和原题有不同。
题目描述
给出一个长为 n 的数列,以及 n 个操作,操作涉及区间乘法,区间加法,单点询问。
输入格式
第一行输入一个数字 n。
第二行输入 n 个数字,第 i 个数字为
,以空格隔开。
接下来输入 n 行询问,每行输入四个数字 opt、l、r、c,以空格隔开。
若 opt=0,表示将位于 [l,r] 的之间的数字都加 c。
若 opt=1,表示将位于 [l,r] 的之间的数字都乘 c。
若 opt=2,表示询问 ar 的值 mod 10007(l 和 c 忽略)。你需要输出非负的余数值。
输出格式
对于每次询问,输出一行一个数字表示答案。
输入输出样例
输入 #1
7 1 2 2 3 9 3 2 0 1 3 1 2 1 3 1 1 1 4 4 0 1 7 2 1 2 6 4 1 1 6 5 2 2 6 4输出 #1
3 100
思路出来了:
首先我们看定义:
- 定义常量 const int N=3e6+10;;
- 定义 n,m,mod(模数),a 数组,lazy_add 数组(加懒标记),lazy_mul 数组(乘懒标记),tr 数组(线段树节点的数组)。
其次看主函数:
- 输入 n,m,mod;
- 初始化 lazy_mul 为 1;
- 输入 a 数组,代表原始数列;
- 使用函数 build(1,1,n);(建树);
- 循环 m 次(循环内