luogu P1578 奶牛浴场

时间:2023-03-09 16:57:35
luogu P1578 奶牛浴场

很好的一道题

王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html

luogu P1578 奶牛浴场

先贴上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

没有考虑如下边界情况

luogu P1578 奶牛浴场

ans=max(ans,(a[j].x-a[i].x)*(yx-yn));

case2:84ps

没有考虑如下情况

luogu P1578 奶牛浴场

case3:56ps

没有考虑上下边界

luogu P1578 奶牛浴场

另:几组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