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的论文,其中说的非常详细. 先枚举极大子矩形的左边界,然后从左到右依次扫描每一个障碍点,并不断修改可行 ...
随机推荐
- 简单的自定义ViewGroup
自定义ViewGroup需要重写onMeasure, onLayout等方法.下面是一个实例,4个View分别显示在四个角. public class MyGroup extends ViewGrou ...
- js 对象与数组相互转化的快捷方法 Object.keys()、Object.values()、Object.entries()
Object.keys() Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性.这些属性的顺序与手动遍历该对象属性时的一致. 例如: let ...
- rest_framework之视图及源码剖析
最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...
- Leetcode 686 Repeated String Match
Given two strings A and B, find the minimum number of times A has to be repeated such that B is a su ...
- Python学习第三篇——访问列表部分元素
dongman =["huoying","sishen","si wang bi ji","pan ni de lu lu xiu ...
- 关于oracle设置主键自增的问题
关于orcale设置主键自增的问题 关于主键Oracle中并没有提供一个直接的语句设置,对于这个oralce一般都是用序列和触发器来实现 一下又两种方法来实现 一 ,不使用触发器 创建序列: crea ...
- python_format格式化输出、while else、逻辑运算符、编码初识
1.格式化输出 .%d %s 格式化输出:% 占位符,d 表示替换整型数,s表示要替换字符串. name = input('请输入名字:') age = input('请输入年龄:') sex = ...
- Shell脚本2
5 Shell传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数, 脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… ...
- 【学习总结】C-翁恺老师-入门-第3周<循环>
[学习总结]C-翁恺老师-入门-总 1-求一个整数的位数:引入循环while 注:循环体内要有改变循环的机会,要不然就死循环了啊! 注:手写推测程序是否正确. 注:测试程序-边界:个位数.10.0.负 ...
- Jeecg-Boot Spring Boot
Jeecg-Boot 1.0 发布,企业级快速开发平台 - 开源中国https://www.oschina.net/news/104889/jeecg-boot-1-0-released