热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线段树详解与实现

本文详细介绍了线段树的基本概念及其在编程竞赛中的应用,并提供了一个具体的线段树实现代码示例。

线段树是一种高效的数据结构,常用于解决区间查询和更新问题。它通过将区间分割成多个子区间来提高查询效率,特别适用于需要频繁进行区间修改和查询的场景。

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std;
7
8 const int MAXN = 200005;
9
10 int n, m, op, a, b;
11 long long val;
12 int arr[MAXN];
13
14 struct SegmentTree {
15 int left, right;
16 long long sum;
17 int lazy;
18 } tree[4 * MAXN];
19
20 void pushUp(int node) {
21 tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum;
22 }
23
24 void pushDown(int node) {
25 if (tree[node].lazy) {
26 tree[node * 2].lazy += tree[node].lazy;
27 tree[node * 2 + 1].lazy += tree[node].lazy;
28 tree[node * 2].sum += (tree[node * 2].right - tree[node * 2].left + 1) * tree[node].lazy;
29 tree[node * 2 + 1].sum += (tree[node * 2 + 1].right - tree[node * 2 + 1].left + 1) * tree[node].lazy;
30 tree[node].lazy = 0;
31 }
32 }
33
34 void build(int node, int start, int end) {
35 tree[node].left = start;
36 tree[node].right = end;
37 tree[node].lazy = 0;
38 if (start == end) {
39 tree[node].sum = arr[start];
40 return;
41 }
42 int mid = (start + end) / 2;
43 build(node * 2, start, mid);
44 build(node * 2 + 1, mid + 1, end);
45 pushUp(node);
46 }
47
48 void update(int node, int start, int end, long long value) {
49 if (tree[node].left >= start && tree[node].right <= end) {
50 tree[node].lazy += value;
51 tree[node].sum += (tree[node].right - tree[node].left + 1) * value;
52 return;
53 }
54 pushDown(node);
55 int mid = (tree[node].left + tree[node].right) / 2;
56 if (start <= mid) update(node * 2, start, end, value);
57 if (end > mid) update(node * 2 + 1, start, end, value);
58 pushUp(node);
59 }
60
61 long long query(int node, int start, int end) {
62 if (tree[node].left >= start && tree[node].right <= end) return tree[node].sum;
63 pushDown(node);
64 int mid = (tree[node].left + tree[node].right) / 2;
65 long long result = 0;
66 if (start <= mid) result += query(node * 2, start, end);
67 if (end > mid) result += query(node * 2 + 1, start, end);
68 return result;
69 }
70
71 int main() {
72 cin >> n;
73 for (int i = 1; i <= n; i++) cin >> arr[i];
74 build(1, 1, n);
75 cin >> m;
76 for (int i = 1; i <= m; i++) {
77 cin >> op;
78 if (op == 1) {
79 cin >> a >> b >> val;
80 update(1, a, b, val);
81 } else if (op == 2) {
82 cin >> a >> b;
83 cout <84 }
85 }
86 return 0;
87 }

查看代码

 


来源链接: https://www.cnblogs.com/chezhongyang/p/11584976.html


推荐阅读
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 本文介绍两道有趣的编程问题:一是寻找给定数字n的连续数字序列及其个数,二是模拟一个翻杯子的游戏。同时附带一道智商题供读者思考。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 本文探讨了符号三角形问题,该问题涉及由相同数量的“+”和“-”符号组成的三角形。通过递归回溯法,可以有效地搜索并计算符合条件的符号三角形的数量。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • Android 6.0 切换指定 Wi-Fi 的解决方案
    本文详细介绍了在 Android 6.0 系统中切换到指定 Wi-Fi 的方法,包括常见的问题、原因分析及解决方案。通过官方文档和代码示例,帮助开发者更好地理解和实现这一功能。 ... [详细]
  • Java多线程实现:从1到100分段求和并汇总结果
    本文介绍如何使用Java编写一个程序,通过10个线程分别计算不同区间的和,并最终汇总所有线程的结果。每个线程负责计算一段连续的整数之和,最后将所有线程的结果相加。 ... [详细]
author-avatar
不言不语都可以温柔_631
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有