分类: 线段树
题意: 求矩阵面积并
输入: 矩阵个数N,每个矩阵的左下角坐标和右上角坐标
输出: 矩阵的面积并
很久没有做数据结构了,这道题算是比较经典,难度相对适中的吧,今天拿出来写了一遍。数据结构主要是线段树。虽然写过几次了,每次动手写都会遇到一些问题。做个笔记:
1.基本算法:
将矩形沿着Y方向的平行于X轴的线作为扫描线。核心算法在于对于n – 1条扫描线作的高度差用来算矩阵的面积
上面两张是比较好理解的图(来自网络)。线段树的作用就在于保存当前的X轴覆盖区域的长度为多少,每一次,顺着扫描方向,插入一段扫描线更新当前的覆盖区域长度(会有重合)。
一个技巧:把下边的边flag设置为true,上面的边设置为false,然后在线段树中记录有多少个覆盖记录,以方便计算
2.去重与排序
可以用STL的unique,当然也可以手写,排序也是不可缺少的,本题数据量而言,时间复杂度是完全可以满足的
3.二分查找
一种映射关系,因为x坐标是浮点数,所以不可以直接离散化,需要一种映射
4.树的写法
node需要携带什么信息?如何建树和存储?
重点中的重点:插入线段的时候应该如何处理?
如何更新?
1 #include 2 #include 3 #include