码迷,mamicode.com
首页 > 其他好文 > 详细

【DP悬线法】奶牛浴场

时间:2018-12-12 23:45:48      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:i++   cstring   efi   strong   pac   algo   cst   sort   put   

虽然还是悬线法,但是这道题可不能轻易地套模板了,而是要换一种思路,横着扫一遍,竖着扫一遍,时间复杂度依旧是O(n^2),然而空间复杂度有一定的优化

如果用原来的方法,显然时间空间都会炸(如果你想用map我也没办法...时间换空间?)

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define st short int
using namespace std;
inline int read(){
    char chr=getchar();    int f=1,ans=0;
    while(!isdigit(chr)) {if(chr==-) f=-1;chr=getchar();}
    while(isdigit(chr))  {ans=(ans<<3)+(ans<<1);ans+=chr-0;chr=getchar();}
    return ans*f;
}
void write(int x){
    if(x<0) putchar(-),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+0);
}
struct P{int x,y;}a[5005];
int L,W,n,x,y,ans;
bool cmp1(const P &x,const P &y){return x.x<y.x||x.x==y.x&&x.y<y.y;}
bool cmp2(const P &x,const P &y){return x.y<y.y||x.y==y.y&&x.x<y.x;}
int main(){
    L=read(),W=read(),n=read();
    for(int i=1;i<=n;i++)x=read(),y=read(),a[i]=(P){x,y};
    a[++n]=(P){0,0},a[++n]=(P){0,W},a[++n]=(P){L,0},a[++n]=(P){L,W};
    sort(a+1,a+n+1,cmp1);
    for(int i=1;i<=n;i++){
        int le=0,ri=W,cnt=i;
        while(a[i].x==a[cnt].x) cnt++;
        int j=cnt;
        while(j<=n){
            ans=max(ans,(a[j].x-a[i].x)*(ri-le));
            if(a[j].y<=a[i].y) le=max(le,a[j].y);
            else ri=min(ri,a[j].y);
            ++j;
        }le=0,ri=W,j=cnt;
        while(j<=n){
            ans=max(ans,(a[j].x-a[i].x)*(ri-le));
            if(a[j].y<a[i].y) le=max(le,a[j].y);
            else ri=min(ri,a[j].y);
            ++j;
        }
    }sort(a+1,a+n+1,cmp2);
    for(int i=1;i<=n;i++){
        int le=0,ri=L,cnt=i;
        while(a[i].y==a[cnt].y) cnt++;
        int j=cnt;
        while(j<=n){
            ans=max(ans,(a[j].y-a[i].y)*(ri-le));
            if(a[j].x<=a[i].x) le=max(le,a[j].x);
            else ri=min(ri,a[j].x);
            ++j;
        }le=0,ri=L,j=cnt;
        while(j<=n){
            ans=max(ans,(a[j].y-a[i].y)*(ri-le));
            if(a[j].x<a[i].x) le=max(le,a[j].x);
            else ri=min(ri,a[j].x);
            ++j;
        }
    }cout<<ans;
    return 0;
}

 

【DP悬线法】奶牛浴场

标签:i++   cstring   efi   strong   pac   algo   cst   sort   put   

原文地址:https://www.cnblogs.com/zhenglw/p/10111385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!