洛谷P1578
P1578 奶牛浴场
我套!蓝题。。
一开始写悬线法,不过红绿都有,甚至还有MLE
找题解又让我学到了新方法:
障碍点少时可以用极大矩阵法
如果让我试着用最短语言描述就是:
从左/上到右/下枚举每个障碍点所在x/y轴为矩形左/上边,
同时迭代计算以该障碍点往后所有障碍存在其对边的情况,如果两点中间有其他障碍点,就y/x轴方向上最近的点更新为上下/左右边,计算面积。
时间复杂度为O(障碍点数量的平方),在障碍点少且测量范围巨大时,可以做到高效率解题
点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5005;
int l, w, n, ans;
struct node {
int x, y;
} a[N];
bool cmpx(node a, node b) {
return a.x < b.x;
}
bool cmpy(node a, node b) {
return a.y < b.y;
}
int main() {
cin >> l >> w >> n;
for(int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y;
a[++n].x = 0, a[n].y = 0;
a[++n].x = 0, a[n].y = w;
a[++n].x = l, a[n].y = 0;
a[++n].x = l, a[n].y = w;
int left = 0, right = 0, up = 0, down = 0;
sort(a+1, a+n+1, cmpx);
for(int i = 1; i <= n; i++) {
left = a[i].x;
up = w, down = 0;
for(int j = i + 1; j <= n; j++) {
right = a[j].x;
ans = max(ans, (right - left) * (up - down));
if(a[j].y > a[i].y) up = min(up, a[j].y);
else down = max(down, a[j].y);
}
}
sort(a + 1, a + n + 1, cmpy);
for(int i = 1; i <= n; i++)
{
down = a[i].y;
left = 0, right = l;
for(int j = i + 1; j <= n; j++)
{
up = a[j].y;
ans = max(ans, (right - left) * (up - down));
if(a[j].x > a[i].x) right = min(right, a[j].x);
else left = max(left, a[j].x);
}
}
cout << ans;
return 0;
}

浙公网安备 33010602011771号