当前位置: 首页 > news >正文

##题解##洛谷P1578##最大子矩形 扫描线法

[传送门](P1578 [WC2002] 奶牛浴场 - 洛谷)

题意概述

在矩形里放置若干障碍点,求各边平行于原矩形的最大子矩形(子矩形不包含障碍点)

分析

1. 最大子矩形容易想到悬链线方法,然而时间复杂度O(LW) L,W均为3*1e4大小,会超时。

  1. 我们注意到障碍点n的个数只有5000,于是我们通过枚举障碍点的方法枚举极大子矩形,再找出最大子矩形。

参考wzk《浅谈用极大化思想解决最大子矩形问题》

算法实现

将整个矩形四个顶点加入障碍点集合

双指针枚举横坐标,得到双障碍点组

以双障碍点组为左右边界,确定上下边界,找到极大子矩形

流程如图

代码实现

#include<bits/stdc++.h>
using namespace std;
int read()
{int sum = 0, f = 1;char c = getchar();while (c< '0' or c>'9'){if (c == '-')f = -1;c = getchar();}while (c >= '0' and c <= '9'){sum = (sum << 1) + (sum << 3) + c - '0';c = getchar();}return sum * f;
}struct S
{int x, y;
} s[5010];bool cmp1(S a, S b)
{if (a.x != b.x) return a.x < b.x;else return a.y < b.y;
}bool cmp2(S a, S b)
{if (a.y != b.y) return a.y < b.y;else return a.x < b.x;
}int l, w, n, ans;int main()
{l = read(), w = read(), n = read();for (int i = 1; i <= n; i++)s[i].x = read(), s[i].y = read();s[++ n].x = 0, s[n].y = 0; //将四个顶点设为障碍点s[++ n].x = 0, s[n].y = w;s[++ n].x = l, s[n].y = 0;s[++ n].x = l, s[n].y = w;int x1, x2, y1, y2;
//从左往右sort(s + 1, s + 1 + n, cmp1);for (int i = 1; i <= n; i++){x1 = s[i].x, y1 = 0, y2 = w;for (int j = i + 1; j <= n; j++){x2 = s[j].x;ans = max(ans, (x2 - x1) * (y2 - y1));if (s[j].y < s[i].y) y1 = max(y1, s[j].y);else y2 = min(y2, s[j].y);}}
//从右往左for (int i = n; i >= 1; i--){x1 = s[i].x, y1 = 0, y2 = w;for (int j = i - 1; j >= 1; j--){x2 = s[j].x;ans = max(ans, (x2 - x1) * (y2 - y1));if (s[j].y < s[i].y) y1 = max(y1, s[j].y);else y2 = min(y2, s[j].y);}}
//从下往上,以整个矩形边界为极大子矩形的边sort(s + 1, s + n + 1, cmp2);for (int i = 1; i <= n - 1; i++)ans = max(ans, l * (s[i + 1].y) - s[i].y);printf("%d", ans);
}

Trick/错误总结

  1. 快读

  2. 最大子矩形扫描线法:O(S)

  3. 最大子矩形悬线法:O(MN)

http://www.rkmt.cn/news/46785.html

相关文章:

  • 【Azure Developer】azd 安装最新版无法登录中国区问题二:本地Windows环境遇问题
  • Mac 下载 VMware 11.1.0-1.dmg 后如何安装?超简单教程(附安装包)
  • 在R中生成交互地图leaflet包
  • 重启 MariaDB 数据库服务
  • 重练算法(代码随想录版) day 7 -哈希表part2
  • 团队作业2——《需求规格说明书》
  • gmssl常用命令 - 需要持续更新
  • 实用指南:根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型
  • 转转客服IM聊天系统背后的技术挑战和实践分享
  • 实验 5:ViT Swin Transformer
  • chatTTS源码版本地部署踩的坑
  • 第一讲机器学习基础
  • 第二十八天
  • 102302138 林楚涵 作业2
  • PWM妙用:解锁LED亮度调节与呼吸灯的LuatOS开发之旅
  • 主子式与顺序主子式
  • JAVA 随机函数
  • CF1327F AND Segments
  • Kimi会员双11砍价成功!0.99元首月链接分享
  • 鸿蒙NEXT系列之精析NDK UI API(节点增删和属性设置) - 实践
  • 通用cursor rules总结
  • 锡林郭勒西林瓶灌装清洗耗材月成本分析?查行情享优惠
  • AI Agent OS 探索有价值的论文分析(1):Sleep-time Compute
  • 宏定义的高级应用
  • 被问性能后,我封装了这个 PHP 错误上报工具
  • 公众号中的贴纸素材有什么作用?在哪里找?
  • 公众号怎么起爆款标题?有什么好用的工具?
  • 邢台西林瓶灌装机优选指南:聚焦资质、案例与售后
  • 2025年机械磨优质厂家权威推荐榜单:冲击磨/小型机械磨/超微机械磨源头厂家精选
  • jQuery custom content scroller滚动条控件代码 - 教程