• luogu P1578 奶牛浴场


    很好的一道题

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

    先贴上AC代码

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 template<class T>void read(T &x){
     6     int f=0;x=0;char ch=getchar();
     7     while(ch<'0'||ch>'9')  {f|=(ch=='-');ch=getchar();}
     8     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
     9     x=f?-x:x;
    10 }
    11 
    12 const int N=5007;
    13 int ans,yx,yn,n,l,w,lst;
    14 bool qwq[30007];
    15 struct yhhh{
    16     int x,y;
    17 }a[N];
    18 
    19 inline bool cmp(yhhh A,yhhh B){
    20     return A.x<B.x;
    21 }
    22 
    23 int main(){
    24     read(l),read(w),read(n);
    25     for(int i=1;i<=n;++i)
    26         read(a[i].x),read(a[i].y),qwq[a[i].y]=1;
    27     for(int i=0;i<=w;++i)
    28         if(qwq[i]){
    29             ans=max(ans,w*(i-lst));
    30             lst=i;
    31         }
    32     ans=max(ans,w*(w-lst));
    33     a[++n].x=0,a[n].y=0;
    34     a[++n].x=l,a[n].y=0;
    35     a[++n].x=0,a[n].y=w;
    36     a[++n].x=l,a[n].y=w; 
    37     sort(a+1,a+n+1,cmp);
    38     for(int i=1;i<=n;++i){
    39         yn=0,yx=w;
    40         for(int j=i+1;j<=n;++j){
    41             if(yx<=yn) break;
    42             if(a[j].y>yx||a[j].y<yn) continue;
    43             ans=max(ans,(a[j].x-a[i].x)*(yx-yn));
    44             if(a[j].y>=a[i].y) yx=min(yx,a[j].y);
    45             if(a[j].y<=a[i].y) yn=max(yn,a[j].y);
    46         }
    47         ans=max(ans,(yx-yn)*(l-a[i].x));
    48     }
    49     for(int i=n;i>=1;--i){
    50         yn=0,yx=w;
    51         for(int j=i-1;j>=1;--j){
    52             if(yx<=yn) break;
    53             if(a[j].y>yx||a[j].y<yn) continue;
    54             ans=max(ans,(a[i].x-a[j].x)*(yx-yn));
    55             if(a[j].y>=a[i].y) yx=min(yx,a[j].y);
    56             if(a[j].y<=a[i].y) yn=max(yn,a[j].y);
    57         }
    58     }
    59     printf("%d
    ",ans);
    60     return 0;
    61 } 

    case1:93ps

    数据:

    IN      6 4 4 1 2 4 1 4 3 2 1

    OUT 10

    没有考虑如下边界情况

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

     case2:84ps

    没有考虑如下情况

    case3:56ps

    没有考虑上下边界

    另:几组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
  • 相关阅读:
    20111013 18:32 女友刁钻无聊问题之标准答案
    20111013 17:40 学ACM有什么用
    typedef用法(1)
    深入C++的new(20111115 15:08 )
    用四个0算二十四点
    20111010 20:14 HDU 4021 (15数码)
    pku3020 Antenna Placement (解法1)
    C++箴言:理解typename的两个含义
    20110907 00:16 ubuntu 如何修改当前用户名
    vc6.0中添加msdn 20111105 11:52
  • 原文地址:https://www.cnblogs.com/Peper/p/9948505.html
Copyright © 2020-2023  润新知