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

    转自:http://blog.csdn.net/idiszerg/article/details/3875934 使用ATL向导的话,会在resource中产生一个rgs的注册脚本文件放在" ...

  2. 高清摄像头MIPI接口与ARM处理器的连接

    MIPI摄像头常见于手机.平板中,支持500万像素以上高清分辨率.它的全称为“Mobile Industry Processor Interface”,分为MIPI DSI 和MIPI CSI,分别对 ...

  3. ubuntu错误解决。

    ubuntu中出现如下错误: W: Failed to fetch http://cn.archive.ubuntu.com/ubuntu/dists/precise-backports/main/i ...

  4. Centos 6.4 openNebula4

    我们实验室的 OpenNebula 3.2 已经很稳定的运行了两年,除了开头一个月不熟悉这套云计算软件有点乱.容易犯错外接下来的时间里都很稳定,期间还包括一次防火演习(突然拉闸似断电)和安全检查(计划 ...

  5. 分布式系统里session同步的那些事儿

    几周前,有个盆友问老王,说现在有多台服务器,怎么样来解决这些服务器间的session同步问题?老王一下就来精神了,因为在n年以前,老王还在学校和几个同学一起所谓创业的时候,也遇到了类似的问题.当时查了 ...

  6. Java Struts2 的请求处理流程详解

    一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是 ...

  7. Redis教程02——管道(Pipelining)

    请求/响应协议和RTT Redis是一个使用客户端/服务器模型(也被称作请求/响应协议)的TCP服务器. 这说明通常来讲一个一个请求的实现有以下步骤: 客户端发送请求到服务器,并从socket中以堵塞 ...

  8. 创建oracle 密码文件

    orapwd file='$ORACLE_HOME/dbs/oratest' password=oracle entries=5 force=y; 说明:●FILE参数指定口令文件存放的全路径及文件名 ...

  9. HTTP协议的特点

    HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的 ...

  10. config 数据库字符串的读取、修改 分类: WebForm 2014-12-16 10:24 203人阅读 评论(0) 收藏

    config数据库字符串: <connectionStrings>   <add name="MyWebDataString" connectionString= ...