1 条题解

  • 0
    @ 2025-11-5 15:05:16

    题目分析

    我们需要维护多条线段,支持两种操作:

    1. 插入一条新的线段
    2. 查询在某个x坐标处,所有线段中的最高点的y坐标

    这是一个典型的动态线段集最值查询问题。

    算法思路

    关键观察

    对于每条线段,我们可以用直线方程 y=kx+by = kx + b 来表示:

    • 斜率 k=y2y1x2x1k = \frac{y_2 - y_1}{x_2 - x_1}
    • 截距 b=y1kx1b = y_1 - k \cdot x_1

    在查询点 x0x_0 处,线段的y值为:y=kx0+by = k \cdot x_0 + b

    核心算法:李超线段树

    李超线段树是解决此类问题的标准方法:

    数据结构设计:

    • 线段树维护区间 [0,105][0, 10^5](根据数据范围)
    • 每个节点存储在该区间内可能成为最大值的线段

    操作实现:

    1. 插入线段

      • 从根节点开始,比较新线段与当前节点线段
      • 在中点处比较y值,决定替换策略
      • 递归更新左右子树
    2. 查询操作

      • 从根节点到叶子节点路径上
      • 比较所有经过节点的线段在 x0x_0 处的y值
      • 取最大值作为答案

    复杂度分析

    • 插入O(log2M)O(\log^2 M),其中 MM 是x坐标范围
    • 查询O(logM)O(\log M)
    • 总体复杂度:O(mlog2M)O(m \log^2 M),可以处理 m=150000m = 150000 的数据规模

    代码框架

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 100000;  // x坐标范围
    const double eps = 1e-8;
    
    struct Line {
        double k, b;
        Line() : k(0), b(0) {}
        Line(double _k, double _b) : k(_k), b(_b) {}
        double calc(int x) const { return k * x + b; }
    };
    
    class LiChaoTree {
    private:
        Line tree[N << 2];
        
        void update(int node, int l, int r, Line line) {
            // 李超树插入逻辑
        }
        
        double query(int node, int l, int r, int x) {
            // 查询x处的最大值
        }
    
    public:
        void insert(double k, double b) {
            update(1, 0, N, Line(k, b));
        }
        
        double query(int x) {
            return query(1, 0, N, x);
        }
    };
    
    int main() {
        int n, m;
        cin >> n >> m;
        
        LiChaoTree lct;
        
        // 处理初始线段和操作
        // ...
        
        return 0;
    }
    

    注意事项

    1. 精度问题:使用double类型,注意比较时的精度误差
    2. 垂直线段:需要特判 x1=x2x_1 = x_2 的情况
    3. 空查询:没有线段时输出0

    总结

    本题是李超线段树的模板题,关键在于理解线段树节点存储的是区间内的优势线段,通过递归比较和替换来维护这个性质。掌握此数据结构可以解决一类动态维护函数最值的问题。

    • 1

    信息

    ID
    5001
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者