--------------------------------------------不是能不能办到的问题,既然我已经下定决心要成为海贼王了,如果因此而战死的话,也无所谓了。

承接上一章节,继续探索线段树丫!

如何利用线段树进行区间统计?

假设这13个数为1,2,3,4,1,2,3,4,1,2,3,4,1. (A[1]=1,A[2]=2,......A[13]=1)在区间之后标上该区间的数字之和:

如果要计算[2,12]的和,按照之前的算法:
[2,12]=[2] + [3,4] + [5,7] + [8,10] + [11,12]
  29  = 2 + 7 + 6 + 7 + 7
计算5个数的和就可以算出[2,12]的值。

 嘻嘻,下面介绍另一个问题:

如何进行点修改?

以上一个图为讨论的基础:

假设把A[6]+=7 ,看看哪些区间需要修改?[6],[5,6],[5,7],[1,7],[1,13]这些区间全部都需要+7.其余所有区间都不用动。

于是,这颗线段树中,点修改最多修改5个线段树元素(每层一个)。

下图中,修改后的元素用蓝色表示。

一身转战三千里,且去追寻线段树的存储结构:

线段树是一种二叉树,当然可以像一般的树那样写成结构体,指针什么的。
但是它的优点是, 它也可以用数组来实现树形结构,可以大大简化代码。
数组形式适合在编程竞赛中使用,在已经知道线段树的最大规模的情况下,直接开足够空间的数组,然后在上面建立线段树。
简单的记法: 足够的空间 = 数组大小n的四倍。
实际上足够的空间 =  (n向上扩充到最近的2的某个次方)的两倍。
举例子:假设数组长度为5,就需要5先扩充成8,8*2=16.线段树需要16个元素。如果数组元素为8,那么也需要16个元素。
所以线段树需要的空间是n的两倍到四倍之间的某个数,一般就开4*n的空间就好,如果空间不够,可以自己算好最大值来省点空间。
怎么用数组来表示一颗二叉树呢?假设某个节点的编号为v,那么它的左子节点编号为2*v,右子节点编号为2*v+1。
然后规定根节点为1.这样一颗二叉树就构造完成了。通常2*v在代码中写成 v<<1 。 2*v+1写成 v<<1|1 。

转载于:https://www.cnblogs.com/dragondragon/p/11241773.html

线段树入门之夜空星亮相关推荐

  1. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  2. poj1195 Mobile phones 二维线段树入门

    二维线段树就是树套树,线段树套线段树... #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  3. hdu1166敌兵布阵hdu1754I Hate It(线段树入门)

    单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来. http://acm.hdu.edu.cn/showproblem.php?pid=1166 update单点更 ...

  4. 数据结构之线段树入门(单点更新区间查询)

    线段树是学习数据结构必须学习的一种数据结构,在ACM,蓝桥等比赛中是经常出现的.利用线段树解题,会使得题目简单易理解.而且线段树是数据结构中比较基础而且用的很多的一种. 线段树定义 线段树是一种二叉搜 ...

  5. 线段树入门 (zz)

    从简单说起,线段树其实可以理解成一种特殊的二叉树.但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构.针对性强,所以效率要高.这里又想到了一句题外话:动态和静态的差别.动态结构较为 ...

  6. 树状数组及线段树入门(SDNU1665-1668)

    目录 前言 树状数组 先导 单点修改区间查询 区间修改区间查询 线段树 先导 单点修改区间查询--递归形式 单点修改区间查询--非递归形式 区间修改区间查询--递归形式 区间修改区间查询--非递归形式 ...

  7. POJ——3624 Balanced Lineup(线段树入门——区间最值问题)

    原题链接:http://poj.org/problem?id=3264 每天挤奶时,农夫John的N头奶牛(1≤N≤50,000头)总是按照相同的顺序排列.一天,农夫约翰决定和几头牛组织一场极限飞盘游 ...

  8. I Hate It(线段树入门)

    线段树(不包含区间更新) 线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b].每一个叶子节点表示了一个单位区间.对于每一个非叶结点所表示的结点[a,b],编号为x,其左儿子表示的区间为[a, ...

  9. 【HDU1698】 Just a Hook 【线段树入门】

    原题:原题链接 题意:(机器翻译的...) 让我们将钩子的连续金属棒从1到N编号.对于每次操作,Pudge可以将连续的金属棒(从X到Y编号)改为铜棒,银棒或金棒. 钩的总值计算为N个金属棒的值的总和. ...

最新文章

  1. 1命名规则 sentinel_Spring Cloud Alibaba 整合 Sentinel 流控
  2. 现代密码学3.3--伪随机生成器/PRG
  3. PMCAFF|来来来!我们一起重新设计微信公众号(图多杀猫 慎重浏览)
  4. python学习过程中随手写的测试脚本-testloop.py
  5. docker:安装mysql多个
  6. 果汁飞溅海报还不会玩?先从临摹学习PSD分层模板开始
  7. 【Hisi系列】之软件平台开发(MPP相关)
  8. mysql neatbean_使用MySQL的NetBeans中的SQL语法错误
  9. wpl计算方法_用于计算加权路径长度(WPL)的C ++二叉树算法
  10. Microsoft Visual SourceSafe 2005 简体中文版
  11. LR杂记--Loadrunner分析系统资源
  12. Nand2Tetris Project1
  13. 万物Linux皆可刷安卓,万物皆可Win,开发者成功在安卓手机刷入Win10系统
  14. [计算机组成原理]-32/64位、寻址能力
  15. 物理仿真实验运用计算机什么用,电脑模拟与物理实验教学
  16. ONNX Runtime: ubutnu16.04编译 (编到怀疑人生)
  17. PS不能完成命令,因为没有足够内存(RAM)
  18. [原创插件] [服务端插件] [新手开发者必看]优秀插件开发教程列表 欢迎回复讨论
  19. MIT molecular Biology 笔记10 翻译
  20. Java基础程序——Set集合排序(四种写法)

热门文章

  1. 树莓派自定义游戏,Minecraft硬件编程,建造房屋,我的世界还可以这样玩
  2. 服务器无法取消指令方块显示,我的世界服务器如何关掉命令方块的提示(如图)...
  3. 求图像边界点坐标c语言,三、Windows图像处理—画点和线(边框函数)
  4. 第五章 多变量线性回归
  5. SSL-ZYC NOIP
  6. 自我提升的10个好习惯
  7. 【​观察】 娃娃也能编程?微软“编程一小时”让你家娃也能变身编程达人
  8. openeuler 21.3 : 使用LVM管理硬盘
  9. 最优化问题的Matlab优化工具箱求解总结
  10. 荣耀X30 Max参数配置