Java 从一组给定的直线出发,如何找到位于任意直线上的点,在特定的x上具有最小的y坐标?

Java 从一组给定的直线出发,如何找到位于任意直线上的点,在特定的x上具有最小的y坐标?,java,geometry,Java,Geometry,一个简单的解决方案是迭代每个直线方程(~1e5个),用给定值替换“x”,获得“y”,并将该“y”与从其他直线方程获得的“y”进行比较。但是,如果查询数量很大(~1e5),此解决方案将无法在时间限制内完成。是否有任何有效的方法可以找到特定“x”的最小“y” 失败的JAVA代码: import java.util.Scanner; class Competitive_Programming { static Scanner sc = new Scanner(System.in);

一个简单的解决方案是迭代每个直线方程(~1e5个),用给定值替换“x”,获得“y”,并将该“y”与从其他直线方程获得的“y”进行比较。但是,如果查询数量很大(~1e5),此解决方案将无法在时间限制内完成。是否有任何有效的方法可以找到特定“x”的最小“y”

失败的JAVA代码:

import java.util.Scanner;

class Competitive_Programming
{
    static Scanner sc = new Scanner(System.in);
    static int N, M;
    static StLine[] lines;

    public static void main(String[] args)
    {
        int i, j;

        N = sc.nextInt();   // Number of straight lines (~1e5)
        lines = new StLine[N];
        for(i = 0; i < N; ++i)
        {
            double m = sc.nextDouble(); // slope
            double c = sc.nextDouble(); //y-intercept
            lines[i] = new StLine(m, c);
        }

        M = sc.nextInt();   // Number of queries (~1e5)
        for(i = 0; i < M; ++i)
        {
            double x = sc.nextDouble(); // The X co-ordinate
            double minY = Double.MAX_VALUE;
            for(j = 0; j < N; ++j)
                minY = Math.min(minY, lines[j].YatX(x));
            System.out.println(minY);   // Minimum Y co-ordinate
        }
    }
}
class StLine
{
    double slope, yintercept;
    StLine(double m, double c)
    {
        slope = m;  yintercept = c;
    }
    double YatX(double x)
    {
        return x * slope + yintercept;
    }
}
import java.util.Scanner;
类竞争程序设计
{
静态扫描仪sc=新扫描仪(System.in);
静态int N,M;
静态StLine[]行;
公共静态void main(字符串[]args)
{
int i,j;
N=sc.nextInt();//直线数(~1e5)
行=新的StLine[N];
对于(i=0;i
任何x的最低y轨迹都是一条凸多段线,最多有N-1个顶点

您可以通过一次添加一行来增量构造它。用简单的方法更新多段线并不困难:对于每个线段,检查它是否穿过新线,只保留“下方”部分。确保保持顶点从左到右的顺序

我怀疑这种操作可以通过类似二分法的过程更有效地完成,但这需要更复杂的数据结构

获得最终多段线后,需要进行简单的二分法搜索才能找到给定x的y


您能分享耗时太长的代码吗?如果这是一个编程问题,请包括一种语言。如果这是一个纯粹的数学问题,我甚至认为通过某种形式的对偶,构造可以转化为点集的凸包问题,这很容易在时间O(N logn)内解决。