P1578 奶牛浴场
P1578 奶牛浴场
题目描述
由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少。为了讨好奶牛,John决定在牛场中建造一个大型浴场。但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点。这回,他又要求助于Clevow了。你还能帮助Clevow吗?
John的牛场和规划的浴场都是矩形。浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合。浴场不能覆盖任何产奶点,但是产奶点可以位于浴场的轮廓上。
Clevow当然希望浴场的面积尽可能大了,所以你的任务就是帮她计算浴场的最大面积。
输入输出格式
输入格式:
输入文件的第一行包含两个整数L和W,分别表示牛场的长和宽。文件的第二行包含一个整数n,表示产奶点的数量。以下n行每行包含两个整数x和y,表示一个产奶点的坐标。所有产奶点都位于牛场内,即:0<=x<=L,0<=y<=W。
输出格式:
输出文件仅一行,包含一个整数S,表示浴场的最大面积。
输入输出样例
10 10
4
1 1
9 1
1 9
9 9
80
说明
0<=n<=5000
1<=L,W<=30000
#include <bits/stdc++.h>
using namespace std;
const int maxn = ;
inline int read() {
int x = ,f = ;
char ch = getchar();
while(ch < '' || ch > '') {
if(ch == '-') f = -;
ch = getchar();
}
while(ch >='' && ch<='') {
x = (x << ) + (x << ) + (ch ^ );
ch = getchar();
}
return x * f;
}
struct node {
int x,y;
} Point[maxn]; //横纵坐标表示一个点
inline bool cmpX(node a,node b) {
return a.x < b.x;
} //按纵坐标排序
inline bool cmpY(node a,node b) {
return a.y < b.y;
} //按横坐标排序
int L,W,n,res;
int main() {
L = read(),W=read(),n=read();
for(int i = ; i <= n; ++i) Point[i].x = read(),Point[i].y = read();
Point[++n].x = ,Point[n].y = ; //手动添加(0,0)这个点
Point[++n].x = L,Point[n].y = ; //手动添加(L,0)这个点
Point[++n].x = ,Point[n].y = W; //手动添加(0,W)这个点
Point[++n].x = L,Point[n].y = W; //手动添加(L,W)这个点
sort(Point + ,Point + n + ,cmpX); //按横坐标排序
for(int i = ; i <= n; ++i) {
int High = W,Low = ,Wid = L - Point[i].x; //High 是上边界 Low 是下边界 Wid-> Width 是向右扫描时理想最大宽度
for(int j = i + ; j <= n; ++j) { //向右扫描
if(res >= Wid * (High - Low)) break; //矩形面积,如果当前构成的矩形都不如答案优,那么就不用更新答案和边界了
res = max(res,(Point[j].x - Point[i].x) * (High - Low)); //如果更优,那么更新答案
if(Point[j].y == Point[i].y) break; //纵坐标相同那么在同一水平直线上 不用更新边界
if(Point[j].y > Point[i].y) High = min(High,Point[j].y); //如果比当前点高,更新上边界
if(Point[j].y < Point[i].y) Low = max(Low,Point[j].y);
}
High = W,Low = ,Wid = Point[i].x; //High 是上边界 Low 是下边界 Wid-> Width 是向左扫描时理想最大宽度
for(int j = i - ; j >= ; --j) { //向左扫描
if(res >= Wid * (High - Low)) break;
res = max(res,(Point[i].x - Point[j].x) * (High - Low)); //除了这里是反着的其余和向右扫一样
if(Point[i].y == Point[j].y) break;
if(Point[j].y > Point[i].y) High = min(High,Point[j].y);
if(Point[j].y < Point[i].y) Low = max(Low,Point[j].y);
}
}
sort(Point + ,Point + n + ,cmpY); //按纵坐标排序开始计算横着一条的子矩形面积
for(int i = ; i <= n - ; ++i) res = max(res,(Point[i+].y - Point[i].y) * L); //更新答案
printf("%d\n",res);
return ;
}
P1578 奶牛浴场的更多相关文章
- 洛谷P1578 奶牛浴场
P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...
- [WC2002][洛谷P1578]奶牛浴场
洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...
- 洛谷 P1578 奶牛浴场
https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ...
- 洛谷 P1578 奶牛浴场 —— 最大子矩形
题目:https://www.luogu.org/problemnew/show/P1578 枚举左边界,向右枚举右边界,同时不断限制上下边界,最后右边界是整个图的边界: 由于没有做左边界是整个图的边 ...
- luogu P1578 奶牛浴场
很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...
- 【Luogu】P1578奶牛浴场(DP,枚举)
题目链接 枚举极大子矩形.详情请见本题题解:I_AM_HelloWord 代码如下 #include<cstdio> #include<cctype> #include< ...
- P1578 奶牛浴场 有障碍点的最大子矩形
这题咕咕了很久终于写了\(QwQ\) 思路:扫? 提交:2次 错因:数据差评,第一次把矩形的长宽搞反了竟然只有一个点没有\(A\). 题解: 显然能成为答案的矩形的边界一定有障碍点或者与大矩形边界重合 ...
- 洛谷 P1578 奶牛浴场 题解
题面 1.定义有效子矩形为内部不包含任何障碍点且边界与坐标轴平行的子矩形.如图所示,第一个是有效子矩形(尽管边界上有障碍点),第二个不是有效子矩形(因为内部含有障碍点). 2.极大有效子矩形:一个有效 ...
- 洛谷 [P1578] WC2002 奶牛浴场
本题是一道用极大化思想求最大子矩阵的经典题目.这个题目很出名,可以在百度搜索王知昆国家队dalao的论文,其中说的非常详细. 先枚举极大子矩形的左边界,然后从左到右依次扫描每一个障碍点,并不断修改可行 ...
随机推荐
- 读写分离子系统 - C# SQL分发子系统 - Entity Framework支持
A2D Framework增加了EF支持,加上原先支持ADO.NET: 支持EF方式 支持ADO.NET方式 这次来讲如何让Entity Framework变成nb的读写分离 1. 先设计EF模型, ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 发送通知功能改进改进
公司有几万个用户,接近10万人,有一些紧急的通知,消息提醒,可以发个及时通知工具,这样可以快速把一些信息通知给大家,让大家快速收到信息,及时通知到系统的每个人. 自动提示信息现实状态,会在客户端自动谈 ...
- 剑指offer--3.从头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路:可以利用push 和unshift /*function ListNode(x){ this.val = x; this. ...
- Cat8 八类网线是什么?与Cat5、Cat6、Cat7网线的区别?
若您身处于网络通信行业,相信您应该了解一些以太网线缆,比如说超五类网线.六类网线和七类网线等等.但是您知道Cat8 八类网线 是什么吗?它与五类网线.六类/超六类网线及七类/超七类网线有着怎么样的区别 ...
- 一些Cassandra+YCSB异常
这两天一直在用YCSB.昨天还可以用的YCSB,今天在测试Cassandra时遇到问题了. 环境是在公用局域网的一台debian机器,YCSB和Cassandra都在这台机器上.异常是开始运行YCSB ...
- MongoDB之$
MongoDB之$ $ 保存符合索引条件的下标 db.userinfo.updateOne({ghobby: },{$set:{'ghobby.2': '四'}}) // 将userinfo表中的g ...
- PHP的内存回收(GC)
php官方对gc的介绍:http://php.net/manual/zh/features.gc.php
- C语言操作WINDOWS系统存储区数字证书相关函数详解及实例
C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...
- ShowDoc上手
ShowDoc是什么 每当接手一个他人开发好的模块或者项目,看着那些没有写注释的代码,我们都无比抓狂.文档呢?!文档呢?!Show me the doc !! 程序员都很希望别人能写技术文档,而自己却 ...
- css兼容display:flex
上代码: 这个是针对父元素: .container{ display: -webkit-box; /* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */ displa ...