这道题是我在寒假的模拟赛里碰到的,现在想起来仍觉得余味无穷。题目大意大致如下:给你一个矩形并在其中划出一个最大的子矩形,当然,在这个矩形里有些地方是取不到的,也就是说我们划的这个子矩形不能包含这些点(边界除外)。那么由于时间问题,就让我简单的说一下王知昆论文里的第一种算法(论文链接:http://pan.baidu.com/s/1bnAl6O3)。

  首先,我们将所有的点按横坐标从小到大排序一下;然后,我们先设置一个上边界(maxy)和一个下边界(miny)(初始值设为矩形的宽和0),再分别以每一个点为左边界从左到右扫一遍,当扫到一个点时若他的y<maxy 则将当前的上边界就更换为他的y(这样的话无论后面怎么扫,这个点都不会跑到矩形里面),反之如果y>miny,miny=y;或许你现在可能会有疑问了:如果y>=maxy||y<=miny怎么办,其实这个的话就可以直接不鸟它,理由是如果改变了这是的maxy或miny则前面的点就会有些落到矩形内,这显然是不符合题意的。

  当从左往右扫完一遍后,我们可以找出以右边界为边的子矩形(当然,这有可能不是最大的),那么对于以左边界为边的子矩形又该怎么办呢......

  想必你已经想到了,不就是再从右往左再扫一遍嘛。好了,这样就完美了吗?是的,如果你提交到vijos就能ac了(数据太弱没办法).但如果再考虑一下就会发现还有分别以左右边界为边的子矩形,这个的话再从上往下扫一遍就行了。

  代码如下:

 #include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=+;
struct node
{
int x;
int y;
}p[maxn];
int l,w,n;
int maxy,miny;
int maxans=,s=;
bool comp(node a,node b)
{
return(a.x<b.x);
}
bool comp1(node a,node b)
{
return (a.y>b.y);
}
void qsort(int left,int right)
{
int i=left,j=right;
int mid=p[(left+right)/].x;
while(i<=j)
{
while(p[i].x<mid)
i++;
while(p[j].x>mid)
j--;
if(i<=j)
{
int temp=p[i].x;
p[i].x=p[j].x;
p[j].x=temp;
i++;
j--;
}
}
if(i<right)
qsort(i,right);
if(j>left)
qsort(left,j);
}
int main()
{
// freopen("happy.in","r",stdin);
// freopen("happy.out","w",stdout);
cin>>l>>w;
cin>>n;
if(n==)
{
cout<<l*w<<endl;
return ;
}
for(int i=;i<=n;i++)
cin>>p[i].x>>p[i].y;
sort(p+,p+n+,comp);
// qsort(1,n);
int dx,dy;
for(int i=;i<=n;i++)
{
miny=;
maxy=w;
s=;
for(int j=i+;j<=n;j++)
{
dx=p[j].x-p[i].x;
dy=maxy-miny;
s=dx*dy;
maxans=max(s,maxans);
// if(p[j].y==p[i].y)
// {
// break;
// }
// if(p[j].y>p[i].y&&p[j].y<maxy)
// {
// maxy=p[j].y;
// }
// if(p[j].y<p[i].y&&p[i].y>miny)
// {
// miny=p[j].y;
// }
if(p[j].y>=p[i].y && p[j].y<maxy)
maxy=p[j].y;
if(p[j].y<=p[i].y && p[j].y>miny)
miny=p[j].y;
}
dx=l-p[i].x;
dy=maxy-miny;
s=dx*dy;
maxans=max(s,maxans);
}
for(int i=n;i>=;i--)
{
maxy=w;
miny=;
s=;
for(int j=i-;j>=;j--)
{
dx=p[i].x-p[j].x;
dy=maxy-miny;
s=dx*dy;
maxans=max(s,maxans);
// if(p[i].y==p[j].y)
// {
// break;
// }
// if(p[j].y>p[i].y&&p[j].y<maxy)
// {
// maxy=p[j].y;
// }
// if(p[j].y<p[i].y&&p[j].y>miny)
// {
// miny=p[j].y;
// }
if(p[j].y>=p[i].y && p[j].y<maxy)
maxy=p[j].y;
if(p[j].y<=p[i].y && p[j].y>miny)
miny=p[j].y;
}
dx=p[i].x;
dy=maxy-miny;
s=dx*dy;
maxans=max(s,maxans);
}
sort(p+,p+n+,comp1);
for(int i=;i<=n;i++)
{
if(i==)
{
dy=w-p[i].y;
s=l*dy;
maxans=max(maxans,s);
}
else if(i==n)
{
dy=p[i].y;
s=l*dy;
maxans=max(maxans,s);
}
else
{
dy=p[i-].y-p[i].y;
s=l*dy;
maxans=max(maxans,s);
}
}
cout<<maxans<<endl;
return ;
}

vijos P1055奶牛浴场&& Winter Camp2002的更多相关文章

  1. Vijos 1055 奶牛浴场

    Description 求一个不覆盖指定点的最大子矩阵,\(n,m \leqslant 3\times 10^5,S \leqslant 5\times 10^3\) . Sol 没有名字的算法都叫x ...

  2. 洛谷P1578 奶牛浴场

    P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...

  3. P1578 奶牛浴场

    P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...

  4. [WC2002][洛谷P1578]奶牛浴场

    洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...

  5. 洛谷1578:[WC2002]奶牛浴场——题解

    https://www.luogu.org/problemnew/show/P1578#sub 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建 ...

  6. vijos1055 奶牛浴场

    挺好的一道题呢 O(n^2)或者O(wh) #include<cstdio> #include<cstring> #include<cstdlib> #includ ...

  7. Vijos1055 奶牛浴场(极大化思想求最大子矩形)

    思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路 ...

  8. 洛谷 [P1578] WC2002 奶牛浴场

    本题是一道用极大化思想求最大子矩阵的经典题目.这个题目很出名,可以在百度搜索王知昆国家队dalao的论文,其中说的非常详细. 先枚举极大子矩形的左边界,然后从左到右依次扫描每一个障碍点,并不断修改可行 ...

  9. luogu P1578 奶牛浴场

    很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...

随机推荐

  1. 解决外部机器通过VM内ubuntu IP 无法访问vm内web服务的问题

    1. 2.i root@ubuntu:/home/udapeng# ifconfig root@ubuntu:/www/sentry# nano uwsgi.ini root@ubuntu:/www/ ...

  2. MongoDB性能优化指南

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...

  3. Google改变生活

    前言 前天,在图书馆,无意之中,发现这本书,特写博客来与各位前来下榻本园的博友们,分享和学习!  本博文的主要内容有: 参考此书.感谢韩梅编者,出于此,我写本博文为了方便日后自己的查阅使用和来我园的共 ...

  4. Domino - SGU 101 (欧拉路径)

    题目大意:这是一个多米诺骨游戏,这个游戏的规则就是一个连着一个,现在给出 N 个多米诺,每个多米诺两边都有一个编号,相邻的多米诺的编号要一致,当然多米诺是可以翻转的(翻转就加‘-’,不翻转是‘+’), ...

  5. css3图片滤镜

    http://www.zhanxin.info/development/2012-12-19-css-filter.html

  6. 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  7. Linux Resin 安装

    1 Resin 下载 Resin 官方下载网址. 最新版下载 resin-4.0.36.tar.gz(免费版) resin 安装须要提前配置好jdk.配置jdk请看上面文章 2 Resin 安装 (1 ...

  8. Swift 表视图动画教程: Drop-In Cards

    http://www.raywenderlich.com/76024/swift-table-view-animations-tutorial-drop-cards 标准 table view 是一个 ...

  9. rsyslog 详解3

    http://blog.clanzx.net/2013/12/31/rsyslog.html http://www.centosabc.com/archives/601 http://www.cnbl ...

  10. 【Linux学习笔记】用nc实现两台主机间的文件传输(不需要输密码)

    通常,可以用scp完成两台主机间的文件传输任务,但在主机间未建立信任关系的情况下,scp每次都需要输入密码,用起来感觉不是很方便,之前这篇笔记介绍过不用输入密码执行脚本或传输文件的方法,但对于一些临时 ...