洛谷 [P1578] WC2002 奶牛浴场
来源:互联网 发布:linux系统输入法 编辑:程序博客网 时间:2024/05/17 07:14
本题是一道用极大化思想求最大子矩阵的经典题目。这个题目很出名,可以在百度搜索王知昆国家队dalao的论文,其中说的非常详细。
先枚举极大子矩形的左边界,然后从左到右依次扫描每一个障碍点,并不断修改可行的上下边界,从而枚举出所有以这个定点为左边界的极大子矩形。
需要注意的是,如果扫描到的点不在当前的上下边界内,那么就不需要对这个点进行处理。
这样做是否将所有的极大子矩形都枚举过了呢?
可以发现,这样做只考虑到了左边界覆盖一个点的矩形,因此我们还需要枚举左边界与整个矩形的左边界重合的情况。这还可以分为两类情况。一种是左边界与整个举行的左边界重合,而右边界覆盖了一个障碍点的情况,对于这种情况,可以用类似的方法从右到左扫描每一个点作为右边界的情况.
hack data:10 10
3 3 0 8 2 3 9
正确答案应该是72。
另一种是左右边界均与整个矩形的左右边界重合的情况,对于这类情况我们可以在预处理中完成:先将所有点按纵坐标排序,然后可以得到以相邻两个点的纵坐标为上下边界,左右边界与整个矩形的左右边界重合的矩形,显然这样的矩形也是极大子矩形,因此也需要被枚举到。
对于开始预处理,需要人为添加0,0;0,l;w,0;l,w四个点
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cstdlib>#include <cmath>using namespace std;struct point{ int x,y;}num[5005];int init(){ int rv=0,fh=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') fh=-1; c=getchar(); } while(c>='0'&&c<='9'){ rv=(rv<<1)+(rv<<3)+c-'0'; c=getchar(); } return fh*rv;}int l,w,n,ans,upp,doo;bool cmp(point a,point b){ return a.x==b.x?a.y<b.y:a.x<b.x;}bool cmp2(point a,point b){ return a.y<b.y;}int main(){ freopen("in.txt","r",stdin); l=init();w=init();n=init(); for(int i=1;i<=n;i++){ num[i].x=init();num[i].y=init(); } num[n+1].x=0;num[n+1].y=0; num[n+2].x=0;num[n+2].y=w; num[n+3].x=l;num[n+3].y=w; num[n+4].x=l;num[n+4].y=0; n+=4; sort(num+1,num+n+1,cmp); for(int i=1;i<=n;i++){ upp=0,doo=w; int v=l-num[i].x; for(int j=i+1;j<=n;j++){ if(num[j].y>=upp&&num[j].y<=doo){ if(v*(doo-upp)<=ans) break; ans=max(ans,(doo-upp)*(num[j].x-num[i].x)); if(num[i].y==num[j].y) break; if(num[i].y<num[j].y) doo=min(doo,num[j].y); else upp=max(upp,num[j].y); } } upp=0;doo=w;v=num[i].x; for(int j=i-1;j>=1;j--){ if(num[j].y>=upp&&num[j].y<=doo){ if((doo-upp)*v<=ans) break; ans=max(ans,(doo-upp)*(num[i].x-num[j].x)); if(num[i].y==num[j].y) break; if(num[j].y>num[i].y) doo=min(doo,num[j].y); else upp=max(upp,num[j].y); } } } sort(num+1,num+1+n,cmp2); for(int i=1;i<=n-1;i++){ ans=max(ans,(num[i+1].y-num[i].y)*l); } cout<<ans; fclose(stdin); return 0;}
阅读全文
0 0
- 洛谷 [P1578] WC2002 奶牛浴场
- 【WC2002】奶牛浴场
- 【Wc2002】奶牛浴场
- 【WC2002】奶牛浴场
- 极大化思想——洛谷 P1578 奶牛浴场
- P1578 奶牛浴场(极大化思想)
- [悬线法] COGS 1722 [WC2002]奶牛浴场
- [WC'2002]奶牛浴场
- P1055 奶牛浴场 - Vijos
- vijos p1055奶牛浴场
- Vijos P1055 奶牛浴场
- vijos 1055 奶牛浴场
- vijos 奶牛浴场
- vijos p1005 奶牛浴场[ 极大化思想]
- oldssoj1107奶牛浴场(最大子矩阵)
- [Vijos1055]奶牛浴场(极大子矩形)
- 奶牛浴场---悬线法之算法1
- Vijos[1055]奶牛浴场 极大化思想
- 易混淆 数组的复制与起别名
- c++简单文件读取方法
- 设计模式讲解与代码实践(二十一)——状态
- Java list里面分装的都是对象,按照对象的属性来分组
- 集合
- 洛谷 [P1578] WC2002 奶牛浴场
- RegExp.$1-$9
- ArcGIS 10.1 for Server 架构
- Android实现圆角背景点击效果
- Bitmap和缓存
- 揭秘|电话营销人员的饭碗要被电话机器人抢走了
- 通达OA根据表单内容自动更改名称/文号
- 从别的Eclipse的工作空间copy的maven项目,放到自己的Eclipse的工作空间部署不到tomcat中
- 杭电oj2708 c++第四章