我的第一篇部落格
阿新 • • 發佈:2020-08-12
#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; }