vijos P1055奶牛浴场&& Winter Camp2002

这道题是我在寒假的模拟赛里碰到的,现在想起来仍觉得余味无穷。题目大意大致如下:给你一个矩形并在其中划出一个最大的子矩形,当然,在这个矩形里有些地方是取不到的,也就是说我们划的这个子矩形不能包含这些点(边界除外)。那么由于时间问题,就让我简单的说一下王知昆论文里的第一种算法(论文链接: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的更多相关文章
- Vijos 1055 奶牛浴场
Description 求一个不覆盖指定点的最大子矩阵,\(n,m \leqslant 3\times 10^5,S \leqslant 5\times 10^3\) . Sol 没有名字的算法都叫x ...
- 洛谷P1578 奶牛浴场
P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...
- P1578 奶牛浴场
P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...
- [WC2002][洛谷P1578]奶牛浴场
洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...
- 洛谷1578:[WC2002]奶牛浴场——题解
https://www.luogu.org/problemnew/show/P1578#sub 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建 ...
- vijos1055 奶牛浴场
挺好的一道题呢 O(n^2)或者O(wh) #include<cstdio> #include<cstring> #include<cstdlib> #includ ...
- Vijos1055 奶牛浴场(极大化思想求最大子矩形)
思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路 ...
- 洛谷 [P1578] WC2002 奶牛浴场
本题是一道用极大化思想求最大子矩阵的经典题目.这个题目很出名,可以在百度搜索王知昆国家队dalao的论文,其中说的非常详细. 先枚举极大子矩形的左边界,然后从左到右依次扫描每一个障碍点,并不断修改可行 ...
- luogu P1578 奶牛浴场
很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...
随机推荐
- HDU 4722 Good Numbers 2013年四川省赛题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 题目大意:给定一个区间,求区间中有多少个满足每位上的数的和是10的倍数. 解题思路:先打表暴力求 ...
- 【Javascript&Jquery基础归纳】- 加载相关
1.window.onload 必须等到Dom所有元素.包括图片加载完毕后加载,只能编写一个. 2.$(document).ready() DOM结构加载完毕后马上执行,并且可以编写多个. ...
- Bzoj 3781: 小B的询问 莫队,分块,暴力
3781: 小B的询问 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 426 Solved: 284[Submit][Status][Discuss ...
- 如何以非 root 用户将应用绑定到 80 端口-ssh 篇 » 社区 » Ruby China
如何以非 root 用户将应用绑定到 80 端口-ssh 篇 » 社区 » Ruby China 如何以非 root 用户将应用绑定到 80 端口-ssh 篇
- SVN 资源库报错 E175002
遇到一个问题, svn: E175002: OPTIONS request failed on '/' Connection timed out: connect 试了网上好多办法,都没有,最后公司大 ...
- 402. Remove K Digits
(English version is after the code part) 这个题做起来比看起来容易,然后我也没仔细想,先速度刷完,以后再看有没有改进. 用这个来说: 1 2 4 3 2 2 1 ...
- Unity NGUI UILabel文字变色 及相关问题
在同一个UILabel中可以有不同颜色的文字只需要添加BBCode标记[ff0000]Red Label[-],那么在这个标记之间的RedLabel 就会变成红色 注意: 1.文本最终显示的颜色=Co ...
- 怎样安装两个tomcat,怎样配置
装两个tomcat 各自是6.0和7.0 可想执行tomcat6.0 可是实际上却执行tomcat7.0 两个版本号都是用解压缩包 事实上就是不能执行tomcat6.0 仅仅能执行7.0 两个环境变量 ...
- linux 同步备份 rsyncd 相关设置
17:25 2013/10/18------------------ rsync linux 同步备份服务器 配置vi /etc/rsyncd.conf 配置文件 /usr/bin/rsync --d ...
- RSA算法详解及C语言实现
RSA算法它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman.但 ...