【Wc2002】奶牛浴场

来源:互联网 发布:淘宝网天猫女装羽绒服 编辑:程序博客网 时间:2024/05/21 07:53

悬线法模板题,见上文

> `#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;int ans,n,m,z,cnt;struct point{    int x,y;}p[5050];int cmp1(const point &a,const point &b){return a.x<b.x;}int cmp2(const point &a,const point &b){return a.y<b.y;}int main(){    cin>>n>>m>>z;p[0] = (point){0,0};    for (int i = 1;i <= z;i++)    scanf("%d%d",&p[i].x,&p[i].y);    p[++z] = (point){0,m};p[++z] = (point){n,m};    sort(p+1,p+z+1,cmp1);    ans = 0 , cnt = 0;    for (int i = 1;i <= z ;i++)    cnt = max(cnt , p[i].x-p[i-1].x);    ans = cnt * m;    sort(p+1,p+z+1,cmp2);    for (int i = 1;i < z;i++)    {        int up=0,down=n;        for(int j = i + 1;j <= z;j++)        {            ans = max(ans,(down - up) * (p[j].y - p[i].y));            if (p[j].x >= p[i].x&&p[j].x < down)down = p[j].x;            if (p[j].x < p[i].x&&p[j].x > up)up = p[j].x;           }    }//  cout<<ans<<endl;    for (int i = z ;i >= 1;i--)    {       int up = 0,down = n;        for (int j = i-1 ;j > 0 ;j--)        {            if (p[j].x >= p[i].x&&p[j].x < down)down = p[j].x;            if (p[j].x < p[i].x&&p[j].x > up)up = p[j].x;//          if (i==3) cout << p[i].y << ' '<< p[j].y<<endl;        }//      if ((down - up) * p[i].y == 81)cout<<i<<endl;        ans = max(ans,(down - up) * (p[i].y));    }    cout<<ans;}`

跑的很慢,最慢的点跑了250ms,加以枚举剪枝优化后,最慢跑了30ms,应该也是数据水,感觉缺少了对于矩形左边与左边界重合时的枚举。

#include<cstdio>#include<algorithm>using namespace std;int n,l,w,ans;typedef struct{    int x,y;}P;bool cmp(P a,P b){    if(a.x==b.x) return a.y<b.y;    return a.x<b.x;}int main(){    P p[5010];    scanf("%d%d",&l,&w);    p[1].x=0;p[1].y=0;    p[2].x=l;p[2].y=0;    p[3].x=0;p[3].y=w;    p[4].x=l;p[4].y=w;    scanf("%d",&n);    n+=4;    for(int i=5;i<=n;i++)    scanf("%d%d",&p[i].x,&p[i].y);    sort(p+1,p+1+n,cmp);    for(int i=1;i<=n;i++)    {        int u=0,d=w;        for(int j=i+1;j<=n;j++)        {            if(p[j].x==p[i].x || p[j].y>d || p[j].y<u) continue;//很关键的优化            ans=max(ans,(p[j].x-p[i].x)*(d-u));            if(p[j].y>u && p[j].y<=p[i].y)u=p[j].y;            if(p[j].y<d && p[j].y>=p[i].y)d=p[j].y;            if(u>=d)break;        }    }    printf("%d\n",ans);    return 0;}
0 0
原创粉丝点击