博客
关于我
POJ 2019 Cornfields (二维RMQ)
阅读量:801 次
发布时间:2023-03-03

本文共 706 字,大约阅读时间需要 2 分钟。

为了帮助 FJ 找到最佳位置放置他的玉米田,需要解决多个查询,每个查询要求在一个 B x B 的子矩阵中找到最大和最小的海拔值。为了高效处理这些查询,通常采用二维范围查询(2D RMQ)算法。

优化后的代码解释

代码使用动态规划预处理矩阵,建立三个三维数组 dpmindpmaxval,分别存储不同块的最小值、最大值和原始值。预处理过程分为几个步骤:

  • 初始化:将所有单元格的 val 值直接赋给 dpmindpmax

  • 计算块大小:通过 mm 数组记录每行和每列的最大块大小。mm[i] 表示第 i 行的最大块大小,mm[j] 表示第 j 列的最大块大小。

  • 预处理动态规划表:从小块到大块逐步构建。对于每个块大小 iijj,从 1 到最大块大小:

    • 对于每个行和列,计算当前块的最小值和最大值。
    • 如果当前块大小大于 1,则更新更大的块的最小和最大值。
  • 查询过程

  • 查询最大值rmq1 函数接受矩形区域的四个顶点,计算所需块的大小 k1k2,然后从预处理表中获取最大值。

  • 查询最小值rmq2 函数同样接受四个顶点,使用预处理表获取最小值。

  • 代码改进

    • 变量命名统一:确保所有变量名清晰,避免混淆。
    • 错误处理:在读取输入时添加错误检查,确保输入有效。
    • 优化预处理:优化动态规划表的构建逻辑,确保预处理时间复杂度为 O(N log N)。
    • 减少内存占用:使用适当的数据结构和优化,降低内存使用,避免内存溢出。

    总结

    通过动态规划预处理,实现了高效的二维范围查询。每个查询的时间复杂度为 O(1),预处理时间复杂度为 O(N log N)。这种方法在处理大量查询时表现优异,能够快速响应用户需求。

    转载地址:http://euxfk.baihongyu.com/

    你可能感兴趣的文章
    Postgresql常用命令行操作_以及Navicat操作PostGis时的问题_自动截取长度_WKB structure does not match exp---PostgreSQL工作笔记005
    查看>>
    PostgreSQL忘记密码
    查看>>
    PostgreSQL数据库pg_dump命令行不输入密码的方法
    查看>>
    postgresql树状结构查询示例
    查看>>
    postgresql流复制配置
    查看>>
    PostgreSQL清空表并保留表结构、清空数据库还原数据库为新建时的状态的方法
    查看>>
    Postman如何做接口测试:如何导入 swagger 接口文档
    查看>>
    Postman如何生成接口文档
    查看>>
    Postman学习之常用断言
    查看>>
    postman居然是用electron开发的,我们来认识下这个框架吧
    查看>>
    postman常用公共函数
    查看>>
    Postman常见问题及解决方法
    查看>>
    Postman接口传参案例
    查看>>
    postman接口功能测试
    查看>>
    Postman接口测试
    查看>>
    Postman接口测试
    查看>>
    Postman接口测试/接口自动化实战教程
    查看>>
    Postman接口测试之POST、GET请求方法
    查看>>
    Postman接口测试之Post、Get请求方法
    查看>>
    Postman接口测试之:添加Cookie伪造请求
    查看>>