博客
关于我
Vijos-P1103题解【线段树】
阅读量:437 次
发布时间:2019-03-06

本文共 699 字,大约阅读时间需要 2 分钟。

一条马路从数轴0到L,每个位置0,1,2,…,L都有一棵树。现需要将一些区间的树清除,区间可能有交集,求清除后还剩下多少棵树。

思路分析

第一感觉,可以用数组a[10000]来模拟马路上的树,1表示有树,每次操作则将对应区间所有点改为0,最终统计为1的点,但时间复杂度O(L*M),这明显不是最优的解法。

再仔细一想,每次都是对一个区间进行操作,而且对每一个点的操作都是相同的,所以考虑是否可以批量操作。

对于批量操作区间有线段树,树状树组等算法,本文讨论用线段树来解,树状树组算法以后会详细介绍。

那么问题来了,为什么会想到用线段树来解呢?即线段树能解决哪类问题?

线段树关键点:大区间的操作及结果等价于两个相邻的子区间操作及结果。

每次对马路上的树进行区间操作,如移除区间[a,b]上的树,也等价于移除区间[a,k],k+1,b上的树。

并且当区间上的树已经移除后,再重复移除也对最终结果无影响。

如上图,树中每个节点表示一段区间,每个节点需要记录如下关键信息:

left: 区间左起点

right: 区间右终点

count: 区间还剩下的树,初始为right-left+1;

1)更新树时,如果区间在需要操作的范围内,则将区间所有树清除,即count=0,直接返回,不需要再去清除所有子节点。

2)父节点同时更新count值,father.count=lson.count+right.count;

  当父节点已经为0,则说明该区间已经全部被清除,此时左右子节点之和可能不等于0,看1)中并没有去清除子节点;

  所以父节点还是保持0

最终剩下的树即为根节点中的树,即root.count。

转载地址:http://jfcyz.baihongyu.com/

你可能感兴趣的文章
QT教程5:消息框
查看>>
SpringBoot中集成阿里开源缓存访问框架JetCache实现声明式实例和方法缓存
查看>>
pom.xml中提示web.xml is missing and <failonmissingw>...
查看>>
Pomelo开发中Web客户端开发API简介
查看>>
QT教程2:QT5的体系构架
查看>>
PON架构(全光网络)
查看>>
PoolingHttpClientConnectionManager原理剖析
查看>>
QT教程1:ubuntu18.04安装QT5
查看>>
POP-一个点击带有放大还原的动画效果
查看>>
POP3 协议在计算机网络中的优缺点
查看>>
qt批量操作同类型控件
查看>>
Portaudio笔记-WASAPI
查看>>
position:fixed失效情况
查看>>
Qt开发笔记:QGLWidget、QOpenGLWidget详解及区别
查看>>
Position属性四个值:static、fixed、absolute和relative的区别和用法
查看>>
POSIX thread编程中关于临界区内条件变量的分析
查看>>
POSIX与程序可移植性
查看>>
posix多线程有感--自旋锁
查看>>
SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)
查看>>
POSIX标准和XSI扩展
查看>>