编程之美 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)
解法二:
可以看出图中的逆序数等于直线的交点数,因为没有3条直线相交于一个点。
直接求解逆序数的方法是O(N^2)
可以用分治的思想降为O(NlogN),可通过归并排序或树状数组求得。