社区讨论
第一个题解的代码注释补全版
P1578[WC2002] 奶牛浴场参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mi6yp2os
- 此快照首次捕获于
- 2025/11/20 12:59 4 个月前
- 此快照最后确认于
- 2025/11/20 12:59 4 个月前
CPP
#include<cstdio>
#include<algorithm>
#include<cstring>
#define re register
#define REP(i,a,b) for (re int i=(a);i<=(b);i++)
#define DREP(i,a,b) for (re int i=(a);i>=(b);i--)
using namespace std;
const int N=5e3+7;
struct Cow{
int x,y;
}a[N];
int L,W,n;
inline bool cmp1(Cow a,Cow b){
return a.x<b.x;
}
inline bool cmp2(Cow a,Cow b){
return a.y<b.y;
}
inline int read(){
re int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9'){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
int main(){
L=read(),W=read(),n=read();
REP(i,1,n)a[i].x=read(),a[i].y=read();
a[++n].x=0;a[n].y=0;
a[++n].x=L;a[n].y=0;
a[++n].x=0;a[n].y=W;
a[++n].x=L;a[n].y=W;
sort(a+1,a+n+1,cmp1);//按横坐标从左到右排序
int res=0;//面积 //res->result
REP(i,1,n)
{
re int h=W,l=0,v=L-a[i].x;//h上界 l下界 v理论最大宽度
REP(j,i+1,n)//向右扫描
{
// if (a[j].y<=h && a[j].y>=l)//在上下界之内 其实不能跳出,不然会错过一些情况,hack数据下附
// {
if (res>=v*(h-l))break; // v*(h-l)理论最大面积 res当前最大面积
res=max(res,(a[j].x-a[i].x)*(h-l)); //更新答案
if (a[j].y==a[i].y)break;//在同一条线上
if (a[j].y>a[i].y) h=min(h,a[j].y);//若点j在点i上方,更新上界
if (a[j].y<a[i].y) l=max(l,a[j].y);//若点j在点i下方,更新下界
// }
}
h=W,l=0,v=a[i].x;//王知昆dalao在此处仍将v设为l-a[i].x,这显然不对,可以自己想一想。//是的233 v应为点i之左的理论最大宽度
DREP(j,i-1,1)//同样地向左扫描
{
// if (a[j].y<=h && a[j].y>=l)
// {
if (res>=v*(h-l))break;
res=max(res,(a[i].x-a[j].x)*(h-l));
if (a[i].y==a[j].y)break;
if (a[j].y>a[i].y) h=min(h,a[j].y);
if (a[j].y<a[i].y) l=max(l,a[j].y);
// }
}
}
//上面已经试过两点加一个纵柱子的情况,接下来讨论两点加一条横柱子
sort(a+1,a+n+1,cmp2);
REP(i,1,n-1)
{
//printf("%d\n",(a[i+1].y-a[i].y)*L);
res=max(res,(a[i+1].y-a[i].y)*L);
}
printf("%d\n",res);
return 0;
}
/*
6 4
4
1 2
4 1
4 3
2 1
*/
/*
10
*/
回复
共 5 条回复,欢迎继续交流。
正在加载回复...