编程之美 1.7光影切割问题

问题:如何快速计算某个时刻,在X[A,B]区间上的地板被光影划分成多少块?

解法一:

两条直线+一个交点=>空间分成4块

三条直线+2个交点=>空间分成6块

三条直线+3个交点=>空间分成7块

n条直线+m个交点=>空间分成n+m+1块

初始化时间复杂度O(N^2),找出所有的交点

每次查询时间复杂度O(m),哪些交点在X[A,B]区间内

若初始化后将交点按x轴排序,初始化需O(N^2+mlogm)

然后每次查询二分查找O(logm)

解法二:

image

可以看出图中的逆序数等于直线的交点数,因为没有3条直线相交于一个点。

直接求解逆序数的方法是O(N^2)

可以用分治的思想降为O(NlogN),可通过归并排序或树状数组求得。

posted @ 2013-10-11 14:59  Linka  阅读(306)  评论(0编辑  收藏  举报