给定由分别由斜率(m)和截距(c)组成的二维数组 arr表示的一组线,以及Q查询,使得每个查询都包含一个值x 。任务是从所有给定的一组行中为每个x值找到 y 的最大值。
The given lines are represented by the equation y = m*x + c.
例子:
Input: arr[][2] ={ {1, 1}, {0, 0}, {-3, 3} }, Q = {-2, 2, 1}
Output: 9, 3, 2
For query x = -2, y values from the equations are -1, 0, 9. So the maximum value is 9
Similarly, for x = 2, y values are 3, 0, -3. So the maximum value is 3
And for x = 1, values of y = 2, 0, 0. So the maximum value is 2.
Input: arr[][] ={ {5, 6}, {3, 2}, {7, 3} }, Q = { 1, 2, 30 }
Output: 10, 17, 213
朴素的方法:朴素的方法是在每一行中替换 x的值并计算所有行中的最大值。对于每个查询,将花费O(N)时间,因此解决方案的复杂性变为O(Q * N) ,其中N是行数, Q是查询数。
有效的方法:想法是使用凸包技巧:
- 从给定的一组行中,可以找到并删除没有意义的行(对于 x 的任何值,它们永远不会给出最大值y ),从而减少该组。
- 现在,如果可以找到每行给出最大值的范围 (l, r) ,则可以使用二分搜索来回答每个查询。
- 因此,创建了一个按斜率递减顺序排列的直线向量,并按斜率递减顺序插入这些直线。
下面是上述方法的实现:
输出:
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。