洛谷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;
}
posted @ 2025-05-14 11:40  Chuan81  阅读(10)  评论(0)    收藏  举报