当前位置: 首页 > news >正文

题解:洛谷 P3372 【模板】线段树 1

【题目来源】

洛谷:P3372 【模板】线段树 1 - 洛谷

【题目描述】

如题,已知一个数列,你需要进行下面两种操作:

  1. 将某区间每一个数加上 k。
  2. 求出某区间每一个数的和。

【输入】

第一行包含两个整数 n,m,分别表示该数列数字的个数和操作的总个数。

第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。

接下来 m 行每行包含 3 或 4 个整数,表示一个操作,具体如下:

  1. 1 x y k:将区间 [x,y] 内每个数加上 k。
  2. 2 x y:输出区间 [x,y] 内每个数的和。

【输出】

输出包含若干行整数,即为所有操作 2 的结果。

【输入样例】

5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4

【输出样例】

11
8
20

【算法标签】

《洛谷 P3372 线段树1》 #线段树#

【代码详解】

#include <bits/stdc++.h>
using namespace std;#define int long long          // 定义int为long long类型
#define lc p << 1             // 左子节点索引
#define rc p << 1 | 1         // 右子节点索引
#define N 100005              // 数组最大长度int n, m, w[N];               // n:元素个数,m:操作次数,w:原始数组// 线段树节点结构体
struct Node
{int l, r;                 // 节点代表的区间[l,r]int sum;                  // 区间和int add;                  // 懒惰标记
} tr[N * 4];                  // 线段树数组/*** 构建线段树* @param p 当前节点索引* @param l 区间左端点* @param r 区间右端点*/
void build(int p, int l, int r)
{tr[p] = {l, r, w[l], 0};  // 初始化节点if (l == r)               // 叶子节点直接返回return;int m = l + r >> 1;       // 计算中点build(lc, l, m);         // 递归构建左子树build(rc, m + 1, r);      // 递归构建右子树tr[p].sum = tr[lc].sum + tr[rc].sum;  // 更新区间和
}/*** 下推懒惰标记* @param p 当前节点索引*/
void pushdown(int p)
{if (tr[p].add)            // 如果有懒惰标记{// 更新左右子节点的区间和tr[lc].sum += tr[p].add * (tr[lc].r - tr[lc].l + 1);tr[rc].sum += tr[p].add * (tr[rc].r - tr[rc].l + 1);// 更新左右子节点的懒惰标记tr[lc].add += tr[p].add;tr[rc].add += tr[p].add;tr[p].add = 0;        // 清除当前节点的懒惰标记}
}/*** 区间查询* @param p 当前节点索引* @param x 查询区间左端点* @param y 查询区间右端点* @return 区间和*/
int query(int p, int x, int y)
{if (x <= tr[p].l && tr[p].r <= y)  // 完全包含区间return tr[p].sum;int m = tr[p].l + tr[p].r >> 1;    // 计算中点pushdown(p);                       // 下推懒惰标记int sum = 0;if (x <= m)sum += query(lc, x, y);        // 查询左子树if (y > m)sum += query(rc, x, y);        // 查询右子树return sum;
}/*** 区间更新* @param p 当前节点索引* @param x 更新区间左端点* @param y 更新区间右端点* @param k 增量值*/
void update(int p, int x, int y, int k)
{if (x <= tr[p].l && tr[p].r <= y)  // 完全包含区间{tr[p].sum += (tr[p].r - tr[p].l + 1) * k;  // 更新区间和tr[p].add += k;                // 更新懒惰标记return;}int m = tr[p].l + tr[p].r >> 1;    // 计算中点pushdown(p);                       // 下推懒惰标记if (x <= m)update(lc, x, y, k);           // 更新左子树if (y > m)update(rc, x, y, k);           // 更新右子树tr[p].sum = tr[lc].sum + tr[rc].sum;  // 更新当前节点的区间和
}signed main()
{cin >> n >> m;for (int i = 1; i <= n; i++)cin >> w[i];                   // 输入原始数组build(1, 1, n);                    // 构建线段树while (m--){int op;cin >> op;if (op == 1)                   // 区间更新操作{int x, y, k;cin >> x >> y >> k;update(1, x, y, k);}else                           // 区间查询操作{int x, y;cin >> x >> y;cout << query(1, x, y) << endl;}}return 0;
}

【运行结果】

5 5
1 5 4 2 3
2 2 4
11
1 2 3 2
2 3 4
8
1 1 5 1 
2 1 4
20
http://www.jsqmd.com/news/394604/

相关文章:

  • 研磨废水回用厂家怎么挑?2026年攻略来了,实验室废水处理/研磨废水回用(处理)/零排放清洗,研磨废水回用源头厂家找哪家 - 品牌推荐师
  • 题解:洛谷 P1099 [NOIP 2007 提高组] 树网的核
  • 闲置支付宝立减金别浪费!合规回收方法来了,新手也能轻松上手 - 可可收
  • Python3教程梳理
  • 题解:洛谷 P5908 猫猫和企鹅
  • 题解:洛谷 P5677 [GZOI2017] 配对统计
  • 2026沸石转轮一体机企业TOP榜:哪些品牌值得关注?催化燃烧/旋风除尘器/除尘器,沸石转轮制造厂家排行榜单 - 品牌推荐师
  • 瑞祥商联卡闲置不用?这样的合规回收方式,新手也能轻松上手 - 可可收
  • 2026年值得推荐的AVIF转WebP在线工具盘点(支持批量转换)
  • 微信立减金回收技巧:47%闲置率下,5招盘活你的“隐形财富” - 可可收
  • 2026年溴化锂中央空调选购指南:值得关注的公司,溴化锂冷水机组/二手溴化锂中央空调,溴化锂中央空调制造企业有哪些 - 品牌推荐师
  • PAM4相关概念
  • 2026年行业内评价高的调节阀厂商如何选,电液动盲板阀/蝶式止回阀/微阻缓闭止回阀/伸缩蝶阀,调节阀生产厂家哪家权威 - 品牌推荐师
  • 2026年中考体育训练新趋势:智慧体育制造企业深度解析,智能运动手环管理平台/握力测试仪,智慧体育生产厂家哪家好 - 品牌推荐师
  • 闲置分期乐购物额度用不上?教你安全高效回收,不浪费一分额度 - 可可收
  • 题解:洛谷 P1631 序列合并
  • 题解:洛谷 P4053 [JSOI2007] 建筑抢修
  • 题解:洛谷 P2161 [SHOI2009] 会场预约
  • 书籍-阿尔伯特·赫尔曼《亚洲古代地理学》
  • IndicEval A Bilingual Indian Educational Evaluation Framework for Large Language Models
  • 2026年上海有实力的宠物口腔医生口碑推荐榜,猫咪牙科/牙科专科/狗狗洗牙/狗口腔溃疡诊疗,宠物口腔医生性价比高的推荐 - 品牌推荐师
  • MultiCW A Large-Scale Balanced Benchmark Dataset for Training Robust Check-Worthiness Detection Mode
  • 题解:洛谷 P3368 【模板】树状数组 2
  • 2026年安徽评价好的家教机构选哪家,大学生家教/小学家教/全托一对一/全托补习班/师范家教/家教,家教机构电话 - 品牌推荐师
  • 题解:洛谷 P3374 【模板】树状数组 1
  • 题解:洛谷 P2085 最小函数值
  • 实用指南:FreeRTOS信号量
  • 看完就会:AI论文写作软件 千笔·专业学术智能体 VS 文途AI,MBA专属神器!
  • 日程邀请类钓鱼邮件攻击深度技术解读与防范
  • 宿主系统产品定义