思路
对于该题,我们建立如下图所示坐标系,横坐标为风速,纵坐标为在该风速下飞机到达0点的时间。那么显然在两条直线有交点的时候表示两架飞机同时到达0点。
虽然知道了这点,但我们不能O(n^2)求直线交,该题期望的是O(nlogn)的解法。在看了杜老师(%%%)的代码后我学到了一种新的姿势:已知多条直线在两个坐标x1,x2(这道题是-w,w)的情况下,我们可以使用树状数组求逆序对的方式来计算直线的交点数量。以本题为例:我们首先定义一个结构体,储存x(坐标的绝对值),v’(考虑风速后的速度),e(通过该值在左端点一样的情况下能够比较右端点),id。我们将-w各个点的值保存在一个vector up中,w保存在另一个vector down中,然后对两个数组根据到零点时间从小到大排序。对每个点我们利用id记录up(左端点)的左边排名,然后对右端点从上往下计算,每次我们查看在该点左端点之前排名的(也就右端点在它上面,左端点在它下面的直线)有几条,利用树状数组来维护这个值即可,最后的和就是我们需要的答案。
代码
1 |
|