这道题我们需要用到王知昆dalao的算法。
我们先要以行为第 关键字排序,再以列为第 关键字排序。
我们从一个点往右扫。
确定一个上边界 和下边界 。
扫的时候不断地去更新。
我们从一个点往左扫。
确定一个上边界 和下边界 。
扫的时候不断地去更新。
还有一种情况就是
所以,我们得判断这种条件。
注意:边界条件,需要手动加 个点
、 、 、
核心代码:
a[++n]={0,0};a[++n]={0,w};a[++n]={l,0};a[++n]={l,w};
sort(a+1,a+n+1,cmp1);
for(int i=1;i<=n;i++){
x=0,y=w;
for(int j=i+1;j<=n;j++){
ans=max(ans,(y-x)*(a[j].x-a[i].x));
if(a[j].y>=a[i].y)y=min(y,a[j].y);
if(a[j].y<=a[i].y)x=max(x,a[j].y);
}
x=0;y=w;
for(int j=i-1;j>=1;j--){
ans=max(ans,(y-x)*(a[i].x-a[j].x));
if(a[j].y>=a[i].y)y=min(y,a[j].y);
if(a[j].y<=a[i].y)x=max(x,a[j].y);
}
}
sort(a+1,a+n+1,cmp2);
for(int i=2;i<=n;i++)ans=max(ans,(a[i].y-a[i-1].y)*l);