社区讨论

第一个题解的代码注释补全版

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 条回复,欢迎继续交流。

正在加载回复...