极大化思想——洛谷 P1578 奶牛浴场

来源:互联网 发布:帝国cms网站源码 编辑:程序博客网 时间:2024/05/24 02:19

https://www.luogu.org/problem/show?pid=1578
论文
https://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html
论文里面唯一的错误就是第一个算法需要添加的点不仅仅是左下右上,4个顶角都要的;
为什么自己模拟就知道了;

#include<bits/stdc++.h>#define Ll long longusing namespace std;const int N=5e3+5;struct cs{int x,y;}d[N];int n,m,t,ans;bool cmp1(cs a,cs b){return a.y<b.y;}bool cmp2(cs a,cs b){return a.x<b.x;}bool cmp3(cs a,cs b){return a.y>b.y;}void work(){    for(int i=1;i<=t;i++){        int ma=n,mi=0;        for(int j=i+1;j<=t;j++){            if(d[j].x>ma||d[j].x<mi)continue;            ans=max(ans,abs(d[i].y-d[j].y)*(ma-mi));            if(d[j].x<d[i].x)mi=d[j].x;else ma=d[j].x;            if(ma==mi)break;        }    }}int main(){    scanf("%d%d%d",&n,&m,&t);    for(int i=1;i<=t;i++)scanf("%d%d",&d[i].x,&d[i].y);    d[++t].x=0;d[t].y=0;d[++t].x=n;d[t].y=m;    d[++t].x=0;d[t].y=m;d[++t].x=n;d[t].y=0;    sort(d+1,d+t+1,cmp2);    for(int i=2;i<=t;i++)ans=max(ans,m*(d[i].x-d[i-1].x));    sort(d+1,d+t+1,cmp1);work();    sort(d+1,d+t+1,cmp3);work();    printf("%d",ans);}
原创粉丝点击