P1578 奶牛浴场 有障碍点的最大子矩形
这题咕咕了很久终于写了\(QwQ\)
思路:扫?
提交:2次
错因:数据差评,第一次把矩形的长宽搞反了竟然只有一个点没有\(A\)。
题解:
显然能成为答案的矩形的边界一定有障碍点或者与大矩形边界重合。
细节见代码(及注释)
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ull unsigned long long
#define ll long long
#define R register int
using namespace std;
#define pause (for(R i=1;i<=10000000000;++i))
#define In freopen("NOIPAK++.in","r",stdin)
#define Out freopen("out.out","w",stdout)
namespace Fread {
static char B[1<<15],*S=B,*D=B;
#ifndef JACK
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
#endif
inline int g() {
R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
if(ch==EOF) return EOF; do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
} inline bool isempty(const char& ch) {return (ch<=36||ch>=127);}
inline void gs(char* s) {
register char ch; while(isempty(ch=getchar()));
do *s++=ch; while(!isempty(ch=getchar()));
}
} using Fread::g; using Fread::gs;
namespace Luitaryi {
const int N=5010;
struct node { int x,y;
inline bool operator <(const node& that) const {return x==that.x?y<that.y:x<that.x;}//按横坐标排序
inline bool operator >(const node& that) const {return y==that.y?x<that.x:y<that.y;}//按纵坐标排序
}a[N];
int n,m,cnt,ans;
inline void main() {
n=g(),m=g(),cnt=g();
for(R i=1;i<=cnt;++i) a[i].x=g(),a[i].y=g();
a[++cnt].x=0,a[cnt].y=0,a[++cnt].x=n,a[cnt].y=m,
a[++cnt].x=0,a[cnt].y=m,a[++cnt].x=n,a[cnt].y=0;//把四个角也当做障碍点,为的是考虑与边界重合的情况
sort(a+1,a+cnt+1);//按横坐标排序
for(R i=1;i<=cnt;++i) {
R up=m,dn=0,w=n-a[i].x;//up:上界,dn:下界,w:可以向右延伸的最大宽度
for(R j=i+1;j<=cnt;++j) {
if(ans>w*(up-dn)) break;//一个小剪枝
ans=max(ans,(a[j].x-a[i].x)*(up-dn));
if(a[i].y==a[j].y) break;//同样高度就不必向右继续扫描
//(此时矩形已经成为了一条线了,但就算你不把它看成线,过这条线且以a[i]为左边界的子矩形也一定不优(可以往左扩))
if(a[i].y<a[j].y) up=min(a[j].y,up);//更新上下界
if(a[i].y>a[j].y) dn=max(a[j].y,dn);
} up=m,dn=0,w=a[i].x;
for(R j=i-1;j;--j) {
if(ans>w*(up-dn)) break;
ans=max(ans,(a[i].x-a[j].x)*(up-dn));
if(a[i].y==a[j].y) break;
if(a[i].y<a[j].y) up=min(a[j].y,up);
if(a[i].y>a[j].y) dn=max(a[j].y,dn);
}
}//此时已经处理完正常情况和与大矩形上下边界重合的情况
sort(a+1,a+cnt+1,greater<node>());//按纵坐标排序
for(R i=1;i<cnt;++i) ans=max(ans,(a[i+1].y-a[i].y)*n);//处理与大矩形左右边界重合的情况
printf("%d\n",ans);
}
}
signed main() {
Luitaryi::main(); return 0;
}
2019.07.23
P1578 奶牛浴场 有障碍点的最大子矩形的更多相关文章
- Vijos1055 奶牛浴场(极大化思想求最大子矩形)
思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路 ...
- P1578 奶牛浴场
P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...
- 洛谷P1578 奶牛浴场
P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...
- 洛谷 P1578 奶牛浴场 题解
题面 1.定义有效子矩形为内部不包含任何障碍点且边界与坐标轴平行的子矩形.如图所示,第一个是有效子矩形(尽管边界上有障碍点),第二个不是有效子矩形(因为内部含有障碍点). 2.极大有效子矩形:一个有效 ...
- [WC2002][洛谷P1578]奶牛浴场
洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...
- 洛谷 P1578 奶牛浴场 —— 最大子矩形
题目:https://www.luogu.org/problemnew/show/P1578 枚举左边界,向右枚举右边界,同时不断限制上下边界,最后右边界是整个图的边界: 由于没有做左边界是整个图的边 ...
- 洛谷 P1578 奶牛浴场
https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ...
- luogu P1578 奶牛浴场
很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...
- 【Luogu】P1578奶牛浴场(DP,枚举)
题目链接 枚举极大子矩形.详情请见本题题解:I_AM_HelloWord 代码如下 #include<cstdio> #include<cctype> #include< ...
随机推荐
- if语句、while和for循环
一.if语句 1.多路分支 if 条件1: 代码块1 elif 条件2: 代码块2 else: 代码块3 #python会执行第一次测试为真的语句,如果所有测试都为假,就执行else部分(本例) 2. ...
- 用Python获取计算机网卡信息
目录 0. 前言 1. 测试环境及关键代码解释 1.1 测试环境 1.1.1 系统: 1.1.2 开发工具: 2. 模块介绍及演示 2.1 platform模块使用示例 2.2 netifaces模块 ...
- Centos7.3安装jenkins
安装jenkins 下载地址: https://jenkins.io/download/最新版本 将Jenkins上传到tomcat的webapp目录 ...
- oj上的测试点信息
Accepted 通过!(AC) Wrong Answer 答案错.(WA) Runtime Error ...
- 怎样确保页面中的js代码一定是在DOM结构生成之后再调用
有这样一类问题, 如下所示, 就是在dom结构没有生成时就在js代码中调用了, 此时就会报错: <head> <script> console.log(document.bod ...
- Django路由及函数视图
路由系统 在django中,uri与逻辑函数的对应关系我们称之为路由系统 伪静态 伪静态是相对于静态文件来说的,例如https://www.cnblogs.com/hesujian/p/1116581 ...
- 为什么加了jquery mobile 会有 Loading 字样在页面底部?【已解决】
这是一个奇怪的问题,用了jquery mobile js库,页面底部就会出现Loading字样, 解决办法如下: 1,正常加上css样式 2,一定要在jquery mobile js库加载之前,设置 ...
- Redis二进制安全概念
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改.破译等,如果被攻击,能够及时检测出来. 二进制安全包含了密码学的一些东西,比如加解密.签名等. 举个例子,你把数据1111000 ...
- C#面向对象 什么是面向对象
1.面向对象(Object Oriented,OO) 是当前计算机界关心的重点,它是90年代软件开发方法的主流.面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围.如数据库系统.交互式界 ...
- macro 标签,和静态文件,以及templates
1 模板 -Templates 1 什么是模板 模板,在Flask中就是允许响应给用户看的网页在模板中,允许包含“占位变量”来表示动态的内容 模板最终也会被解析成字符串再响应给客户端,这一过程通常称为 ...