线段树及例题(含题解)汇总(持续更新)
该来的总要来,寒假没好好学,现在就得为寒假的懒买单(呜呜呜)。看了一天的线段树,虽然看懂还是很容易,毕竟就是一个特殊二叉树,但是实际应用却还是很复杂的,于是开始找些模板题敲敲,争取好好掌握这一数据结构。
至于不了解线段树基础知识的话,这有一大牛博客的传送门:传送门
这里简单介绍下线段树存储:线段树本身就是二叉树,故有:
1、指针存储
2、数组存储(重点讲下):由于线段树是完全二叉树,所以要么没有左右孩子,要么一定有两个,而且左孩子为2root,右孩子为2root+1,于是可以用数组存储,通过下标寻找
难点在于数组大小:基本上为结点数4倍足够
线段树使用于和区间统计有关的问题:
比如某些数据可以按区间进行划分,按区间动态进行修改,而且还需要按区间多次进行查询,
主要操作有:
点修改,点查询,区间查询,区间修改(较难)
常见题型有:
区间最值、区间求和、区间染色、矩形问题、区间k大数、二维线段树、三维线段树(小白瑟瑟发抖。。。)
用线段树解题,关键是要想清楚每个结点要存哪些数据(当然区间起终点,以及左右子节点指针是必须的(也可以通过数组代替))以及这些信息如何高效更新、维护、查询。不要一更新就更新到叶子结点,那样更新效率最坏就可能变成O(n)的了。
基本思路:
先建树,然后插入数据,然后更新,查询
题目链接 | 考察点 | 题解代码 |
---|---|---|
POJ 3264:Balanced Lineup(题目链接) | 区间最大值与最小值之差(区间查询) | 题解 |
hdu 1754:I Hate It(题目链接) | 区间最值(点更新、区间查询) | 题解 |
hdu 2795:Billboard(题目链接) | 点更新 | 题解 |
题目链接 | 考察点 | 题解代码 |
---|---|---|
POJ 3468:A Simple Problem with Integers(题目链接) | 区间和(区间更新,区间查询) | 题解 |
题目链接 | 考察点 | 题解代码 |
---|---|---|
题目链接 | 考察点 | 题解代码 |
---|
题目链接 | 考察点 | 题解代码 |
---|
题目链接 | 考察点 | 题解代码 |
---|
来源:CSDN
作者:52Hertz*
链接:https://blog.csdn.net/boliu147258/article/details/98210873