题目描述
由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少。为了讨好奶牛,John决定在牛场中建造一个大型浴场。但是 John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建 造的浴场不覆盖这些产奶点。这回,他又要求助于Clevow了。你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形。浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合。浴场不能覆盖任何产奶 点,但是产奶点可以位于浴场的轮廓上。 Clevow当然希望浴场的面积尽可能大了,所以你的任务就是帮她计算浴场的最大面积。
输入
输入文件的第一行包含两个整数L和W,分别表示牛场的长和宽。文件的第二行包含一个整数n,表示产奶点的数量。以下n行每行包含两 个整数x和y,表示一个产奶点的坐标。所有产奶点都位于牛场内,即:0<=x<=L,0<=y<=W。
输出
输出文件仅一行,包含一个整数S,表示浴场的最大面积。
样例输入
10 1041 19 11 99 9
样例输出
80
提示
【参数约定】
0 < n < 5000
1 < L,W <30000
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=5003;
struct data{
int x,y;
}a[maxn];
int l,w,n,up,dn,ans=0;
bool cmp1(const data&aa,const data&bb){
return(aa.x<bb.x);
}
bool cmp2(const data&aa,const data&bb){
return(aa.x>bb.x);
}
inline int work(){
for(int i=1;i<=n;++i){
up=w,dn=0;
for(int j=i+1;j<=n;++j){
if(a[j].x==a[i].x)continue;
ans=max(ans,(up-dn)*(a[j].x-a[i].x));
if(a[j].y<=a[i].y && a[j].y>dn)dn=a[j].y;
if(a[j].y>=a[i].y && a[j].y<up)up=a[j].y;
if(up<=dn)break;
}
}
}
inline int get(){
char c;while(!isdigit(c=getchar()));
int v=c-48;while(isdigit(c=getchar()))v=v*10+c-48;
return v;
}
int main(){
l=get();w=get();n=get();
for(int i=1;i<=n;++i)a[i].x=get(),a[i].y=get();
a[++n].x=0,a[n].y=0;
a[++n].x=0,a[n].y=w;
a[++n].x=l,a[n].y=0;
a[++n].x=l,a[n].y=w;
sort(a+1,a+1+n,cmp1);
work();
printf("%d\n",ans);
return 0;
}
思想:见王知昆论文。注意边界的四点要加入。l和w的区分。