
很好的一道题
王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html
先贴上AC代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
template<class T>void read(T &x){
int f=;x=;char ch=getchar();
while(ch<''||ch>'') {f|=(ch=='-');ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
x=f?-x:x;
} const int N=;
int ans,yx,yn,n,l,w,lst;
bool qwq[];
struct yhhh{
int x,y;
}a[N]; inline bool cmp(yhhh A,yhhh B){
return A.x<B.x;
} int main(){
read(l),read(w),read(n);
for(int i=;i<=n;++i)
read(a[i].x),read(a[i].y),qwq[a[i].y]=;
for(int i=;i<=w;++i)
if(qwq[i]){
ans=max(ans,w*(i-lst));
lst=i;
}
ans=max(ans,w*(w-lst));
a[++n].x=,a[n].y=;
a[++n].x=l,a[n].y=;
a[++n].x=,a[n].y=w;
a[++n].x=l,a[n].y=w;
sort(a+,a+n+,cmp);
for(int i=;i<=n;++i){
yn=,yx=w;
for(int j=i+;j<=n;++j){
if(yx<=yn) break;
if(a[j].y>yx||a[j].y<yn) continue;
ans=max(ans,(a[j].x-a[i].x)*(yx-yn));
if(a[j].y>=a[i].y) yx=min(yx,a[j].y);
if(a[j].y<=a[i].y) yn=max(yn,a[j].y);
}
ans=max(ans,(yx-yn)*(l-a[i].x));
}
for(int i=n;i>=;--i){
yn=,yx=w;
for(int j=i-;j>=;--j){
if(yx<=yn) break;
if(a[j].y>yx||a[j].y<yn) continue;
ans=max(ans,(a[i].x-a[j].x)*(yx-yn));
if(a[j].y>=a[i].y) yx=min(yx,a[j].y);
if(a[j].y<=a[i].y) yn=max(yn,a[j].y);
}
}
printf("%d\n",ans);
return ;
}
case1:93ps
数据:
IN 6 4 4 1 2 4 1 4 3 2 1
OUT 10
没有考虑如下边界情况
ans=max(ans,(a[j].x-a[i].x)*(yx-yn));
case2:84ps
没有考虑如下情况
case3:56ps
没有考虑上下边界
另:几组hack数据
IN
6 4
4
1 2
4 1
4 3
2 1
OUT
10
IN
10 10
3
3 0
8 2
3 9
OUT
72
IN
4 7
5
0 6
0 0
3 2
1 0
0 3
OUT
21
IN
10 10
2
8 1
3 9
OUT
80