最近看了几道题 目 poj1151 和 hdu5481 .虽然现在没有写出代码,但是根据这几天的总结,我说说大概的思路和解题的思想 ;
1.poj1151
题意:给你n个矩形,求矩形的面积并 ;
关键思想:由于n的范围很大,一个一个1*1的矩形元枚举是不吭能的,所以要使用所谓的 ‘离散化 ’ 离散化就是把无穷的数变化为有穷的数 ;
首先考虑到我们的最小矩形元并不是1*1,而是在出现的4n个点中的临近的组合。
方法一: 对于每一个矩形,都遍历每一个小矩形元,然后最后统计面积 ;复杂度为 0(n^3) 完全可以接受,期间可以使用二维树状数组,但是没有优化的作用;
方法二: 考虑每个临近的x,每两个临近的就画一条垂直于y的线,这两个线中夹的有两种情况 : 1.没有矩形 2.有矩形 ; 但是如果是第二种那么其中的面积一定是w*(线段的长度并)
由此,我们可以离散化之后使用线扫描一遍 , 每次扫描都可以可以得到所有的夹杂在线中的小矩形的面积 ; 而对于线段的长度并可以是再次使用y轴的线扫描法,但是复杂度就上去了 0(n^2) ; 也可以使用线段树维护一个插入操作 。 复杂度为0(nlgn) ; 完美解决 ; 注意线段树的离散化的 写法很巧妙,不需要使用map也可以完成 ; 具体实现看kuangbin大神的博客 http://www.cnblogs.com/kuangbin/archive/2011/08/16/2140544.html
2.hdu5481 也是考率小线段 ,对于包含的线段的条数可以使用离散化+树状数组类似数区间覆盖个数一样的方法 nlgn ,但也可以使用 线扫描法 , 0(n)来获得结果,而且对于后者 可以不使用map离散化,写法更方便 ;