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

线段树(单点修改,区间查询)

题目链接:单点修改,区间查询build:基于后序遍历和区间二分的思想,递归建树change:rx&

题目链接:单点修改,区间查询


build:基于后序遍历和区间二分的思想,递归建树

change:

  1. r < x or l > x&#xff0c;当前区间与要修改的点无交集&#xff0c;直接return掉 
  2. l &#61;&#61; r and l &#61;&#61; x&#xff0c;这个点为要修改的点&#xff0c;把对应位置修改后return 
  3. 其他情况&#xff0c;递归找要修改的点&#xff0c;同时维护修改后的树

query&#xff1a;

  1. r < s or l > t&#xff0c;当前区间与查询区间无交集&#xff0c;返回0
  2. s <&#61; l and r <&#61; t&#xff0c;当前区间为查询区间的子区间&#xff0c;返回该区间权值
  3. 当前区间与查询区间有部分交集&#xff0c;递归查询子区间的权值

#include
using namespace std;
typedef long long ll;
ll d[4000020], a[1000005];
void build(ll p, ll l, ll r) {if (l &#61;&#61; r) {d[p] &#61; a[l];return;}ll m &#61; l &#43; r >> 1;build(p <<1, l, m);build(p <<1 | 1, m &#43; 1, r);d[p] &#61; d[p <<1] &#43; d[p <<1 | 1];
}
void change(ll p, ll l, ll r, ll x, ll v) {if (r x) {return;} else if (l &#61;&#61; r && l &#61;&#61; x) {d[p] &#43;&#61; v;return;} else {ll m &#61; l &#43; r >> 1;change(p <<1, l, m, x, v);change(p <<1 | 1, m &#43; 1, r, x, v);d[p] &#61; d[p <<1] &#43; d[p <<1 | 1];}
}
ll query(ll p, ll l, ll r, ll s, ll t) {if (r t) {return 0;} else if (s <&#61; l && r <&#61; t) {return d[p];} else {ll m &#61; l &#43; r >> 1;return query(p <<1, l, m, s, t) &#43; query(p <<1 | 1, m &#43; 1, r, s, t);}
}
int main() {ll n, m;cin >> n >> m;for (ll i &#61; 0; i > a[i];}build(1, 0, n - 1);while (m--) {ll op, l, r;cin >> op >> l >> r;if (op &#61;&#61; 1) {change(1, 1, n, l, r);} else {cout <}

二维线段树&#xff1a;


leetcode308.二维区域和检索-可变

给你一个二维矩阵 matrix &#xff0c;你需要处理下面两种类型的若干次查询&#xff1a;

更新&#xff1a;更新 matrix 中某个单元的值。
求和&#xff1a;计算矩阵 matrix 中某一矩形区域元素的 和 &#xff0c;该区域由 左上角 (row1, col1) 和 右下角 (row2, col2) 界定。
实现 NumMatrix 类&#xff1a;

NumMatrix(int[][] matrix) 用整数矩阵 matrix 初始化对象。
void update(int row, int col, int val) 更新 matrix[row][col] 的值到 val 。
int sumRegion(int row1, int col1, int row2, int col2) 返回矩阵 matrix 中指定矩形区域元素的 和 &#xff0c;该区域由 左上角 (row1, col1) 和 右下角 (row2, col2) 界定。
 

来源&#xff1a;力扣&#xff08;LeetCode&#xff09;
链接&#xff1a;https://leetcode-cn.com/problems/range-sum-query-2d-mutable


一维线段树运用二分的思想&#xff0c;将一条线段一分为二&#xff0c;一个结点维护左右两个儿子的信息

二维线段树则是运用四分的思想&#xff0c;横竖两刀&#xff0c;将一个矩形区域分成四份&#xff0c;如同直角坐标系中的四个象限&#xff0c;一个结点维护四个儿子的信息&#xff0c;注意将矩形划分成四份后每个子矩形的坐标&#xff0c;线段树数组记得开16倍

同理&#xff0c;有了这种思想&#xff0c;三维线段树可以八分&#xff0c;四维线段树可以十六分...

class NumMatrix {int t[250 * 250 * 4 * 4 &#43; 5], n, m;
public:void change(int p, int u, int l, int d, int r, int x, int y, int v) {if (u > x || d y || r > 1, my &#61; l &#43; r >> 1;change(p * 4, u, l, mx, my, x, y, v);change(p * 4 &#43; 1, u, my &#43; 1, mx, r, x, y, v);change(p * 4 &#43; 2, mx &#43; 1, l, d, my, x, y, v);change(p * 4 &#43; 3, mx &#43; 1, my &#43; 1, d, r, x, y, v);t[p] &#61; t[p * 4] &#43; t[p * 4 &#43; 1] &#43; t[p * 4 &#43; 2] &#43; t[p * 4 &#43; 3];}}int query(int p, int u, int l, int d, int r, int x1, int y1, int x2, int y2) {if (u > x2 || d y2 || r &#61; x1 && d <&#61; x2 && l >&#61; y1 && r <&#61; y2) {return t[p];} else {int mx &#61; u &#43; d >> 1, my &#61; l &#43; r >> 1;int s1 &#61; query(p * 4, u, l, mx, my, x1, y1, x2, y2);int s2 &#61; query(p * 4 &#43; 1, u, my &#43; 1, mx, r, x1, y1, x2, y2);int s3 &#61; query(p * 4 &#43; 2, mx &#43; 1, l, d, my, x1, y1, x2, y2);int s4 &#61; query(p * 4 &#43; 3, mx &#43; 1, my &#43; 1, d, r, x1, y1, x2, y2);return s1 &#43; s2 &#43; s3 &#43; s4;}}NumMatrix(vector>& matrix) {memset(t, 0, sizeof t);n &#61; matrix.size(), m &#61; matrix[0].size();for (int i &#61; 0; i };


推荐阅读
  • Codeforces竞赛解析:Educational Round 84(Div. 2评级),题目A:奇数和问题
    Codeforces竞赛解析:Educational Round 84(Div. 2评级),题目A:奇数和问题 ... [详细]
  • MSP430F5438 ADC12模块应用与学习心得
    在最近的实践中,我深入研究了MSP430F5438的ADC12模块。尽管该模块的功能相对简单,但通过实际操作,我对MSP430F5438A和MSP430F5438之间的差异有了更深刻的理解。本文将分享这些学习心得,并探讨如何更好地利用ADC12模块进行数据采集和处理。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 本文详细探讨了二元Probit模型及其在实际应用中的重要性。作为一种广义线性模型,Probit模型主要用于处理二分类问题,与Logistic模型类似,但其假设误差项服从标准正态分布。尽管Probit模型在某些领域应用较少,但在特定情境下仍具有独特优势。文章不仅介绍了模型的基本原理,还通过实例分析展示了其在经济学、社会学等领域的具体应用。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • ### 优化后的摘要本文对 HDU ACM 1073 题目进行了详细解析,该题属于基础字符串处理范畴。通过分析题目要求,我们可以发现这是一道较为简单的题目。代码实现中使用了 C++ 语言,并定义了一个常量 `N` 用于字符串长度的限制。主要操作包括字符串的输入、处理和输出,具体步骤涉及字符数组的初始化和字符串的逆序操作。通过对该题目的深入探讨,读者可以更好地理解字符串处理的基本方法和技巧。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
author-avatar
主宰魔尊_164
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有