经典好论文
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=5005;
int sx[N],sy[N],xcnt,ycnt;
bool tag[N][N];
short lft[2][N],rgt[2][N],hgt[2][N];
short pre[N][N],nxt[N][N];
int n;
int x[N],y[N];
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
sx[++xcnt]=0; read(sx[++xcnt]);
sy[++ycnt]=0; read(sy[++ycnt]);
read(n);
for (int i=1;i<=n;i++){
read(x[i]); read(y[i]);
sx[++xcnt]=x[i]; sy[++ycnt]=y[i];
}
sort(sx+1,sx+xcnt+1); xcnt=unique(sx+1,sx+xcnt+1)-sx-1;
sort(sy+1,sy+ycnt+1); ycnt=unique(sy+1,sy+ycnt+1)-sy-1;
int Ans=0;
for (int j=2;j<=ycnt;j++)
Ans=max(Ans,(sy[j]-sy[j-1])*sx[xcnt]);
for (int i=1;i<=n;i++){
x[i]=lower_bound(sx+1,sx+xcnt+1,x[i])-sx;
y[i]=lower_bound(sy+1,sy+ycnt+1,y[i])-sy;
tag[x[i]][y[i]]=1;
}
for (int i=1;i<=xcnt;i++) tag[i][1]=tag[i][ycnt]=1;
for (int j=1;j<=ycnt;j++) tag[1][j]=tag[xcnt][j]=1;
for (int i=1;i<=xcnt;i++){
int last=1;
for (int j=2;j<=ycnt;j++){
if (!tag[i][j]) continue;
for (int k=last+1;k<j;k++) nxt[i][k]=j;
for (int k=last+1;k<j;k++) pre[i][k]=last;
last=j;
}
}
int t=1;
for (int j=1;j<=ycnt;j++)
lft[t][j]=1,rgt[t][j]=ycnt;
for (int i=2;i<=xcnt;i++,t^=1)
for (int j=1;j<=ycnt;j++){
if (tag[i-1][j]){
hgt[t^1][j]=1;
lft[t^1][j]=1;
rgt[t^1][j]=ycnt;
}else{
hgt[t^1][j]=hgt[t][j]+1;
lft[t^1][j]=max(lft[t][j],pre[i-1][j]);
rgt[t^1][j]=min(rgt[t][j],nxt[i-1][j]);
}
Ans=max(Ans,(sx[i]-sx[i-hgt[t^1][j]])*(sy[rgt[t^1][j]]-sy[lft[t^1][j]]));
}
printf("%d\n",Ans);
return 0;
}