1. 程式人生 > 實用技巧 >我的第一篇部落格

我的第一篇部落格

#include<bits/stdc++.h>
#define LL long long
using namespace std;

struct node {
    LL x, y;
} a[5010];

int main() {
    LL L, W;
    scanf("%lld%lld", &L, &W);
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        scanf("%lld%lld", &a[i].x, &a[i].y);
    }
    a[++n]= {0, 0};
    a[++n]= {0, W};
    a[++n]= {L, 0};
    a[++n]= {L, W};
    sort(a+1, a+n+1, [](const node &a,const node &b) {
        return (a.x==b.x)?a.y<b.y:a.x<b.x;
    });
    LL ans=0;
    for(int i=1; i<=n; i++) {
        LL l=0, h=W, v=L-a[i].x;
        for(int j=i+1; j<=n; j++) {
            if(a[j].y<=h&&a[j].y>=l||a[j].x==L) {
                if(v*(h-l)<=ans) { //剪枝
                    break;
                }
                ans=max(ans, (h-l)*(a[j].x-a[i].x));
                if(a[j].y==a[i].y) {
                    break;
                }
                if(a[j].y>a[i].y) {
                    h=min(h, a[j].y);
                } else {
                    l=max(l, a[j].y);
                }
            }
        }
        l=0, h=W, v=a[i].x;
        for(int j=i-1; j>=1; j--) {
            if(a[j].y<=h&&a[j].y>=l||a[j].x==0) {
                if(v*(h-l)<=ans) { //剪枝
                    break;
                }
                ans=max(ans, (h-l)*(a[i].x-a[j].x));
                if(a[j].y==a[i].y) {
                    break;
                }
                if(a[j].y>a[i].y) {
                    h=min(h, a[j].y);
                } else {
                    l=max(l, a[j].y);
                }
            }
        }
    }
    sort(a+1, a+1+n, [](node &a, node &b) {
        return a.y<b.y;
    });
    for(int i=1; i<n; i++) {
        ans=max(ans, (a[i+1].y-a[i].y)*L);
    }
    printf("%lld\n", ans);

    return 0;
}