社区讨论

MLE 0pts求条

P3145[USACO16OPEN] Splitting the Field G参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mlklijjo
此快照首次捕获于
2026/02/13 15:58
4 周前
此快照最后确认于
2026/02/16 16:05
3 周前
查看原帖
空间炸了
求巨佬帮忙压一下空间
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long

struct pt {
    int x, y;
} p[500001];

bool cmp1(const pt& p1, const pt& p2) {
    return p1.x < p2.x;
}

bool cmp2(const pt& p1, const pt& p2) {
    return p1.y < p2.y;
}

int n;

int fxb[500001][30], fxs[500001][30], fyb[500001][30], fys[500001][30];

signed main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> p[i].x >> p[i].y;
    }
    memset(fxs, 0x3f, sizeof (fxs));
    memset(fys, 0x3f, sizeof (fys));
    sort(p + 1, p + n + 1, cmp1);
    int maxnx = p[n].x, minnx = p[1].x;
    for (int i = 1; i <= n; i++) {
        fxb[i][0] = fxs[i][0] = p[i].x;
        fyb[i][0] = fys[i][0] = p[i].y;
    }
    for (int j = 1; (1 << j) <= n; j++) {
        for (int i = 1; i + (1 << (j - 1)) <= n; i++) {
            fxb[i][j] = max(fxb[i][j - 1], fxb[i + (1 << (j - 1))][j - 1]);
            fyb[i][j] = max(fyb[i][j - 1], fyb[i + (1 << (j - 1))][j - 1]);
            fxs[i][j] = min(fxs[i][j - 1], fxs[i + (1 << (j - 1))][j - 1]);
            fys[i][j] = min(fys[i][j - 1], fys[i + (1 << (j - 1))][j - 1]);
        }
    }
    int ans = INT_MAX;
    for (int i = 1; i < n; i++) {
        int l = __lg(i);
        int maxx = max(fxb[1][l], fxb[i - (1 << l) + 1][l]);
        int maxy = max(fyb[1][l], fyb[i - (1 << l) + 1][l]);
        int minx = min(fxs[1][l], fxs[i - (1 << l) + 1][l]);
        int miny = min(fys[1][l], fys[i - (1 << l) + 1][l]);
        int l2 = __lg(n - i);
        int maxx2 = max(fxb[i + 1][l2], fxb[n - (1 << l2) + 1][l2]);
        int maxy2 = max(fyb[i + 1][l2], fyb[n - (1 << l2) + 1][l2]);
        int minx2 = min(fxs[i + 1][l2], fxs[n - (1 << l2) + 1][l2]);
        int miny2 = min(fys[i + 1][l2], fys[n - (1 << l2) + 1][l2]);
        ans = min(ans, (maxx - minx) * (maxy - miny) + (maxx2 - minx2) * (maxy2 - miny2));
    }
    sort(p + 1, p + n + 1, cmp2);
    int maxny = p[n].y, minny = p[1].y;
    for (int i = 1; i <= n; i++) {
        fxb[i][0] = fxs[i][0] = p[i].x;
        fyb[i][0] = fys[i][0] = p[i].y;
    }
    for (int j = 1; (1 << j) <= n; j++) {
        for (int i = 1; i + (1 << (j - 1)) <= n; i++) {
            fxb[i][j] = max(fxb[i][j - 1], fxb[i + (1 << (j - 1))][j - 1]);
            fyb[i][j] = max(fyb[i][j - 1], fyb[i + (1 << (j - 1))][j - 1]);
            fxs[i][j] = min(fxs[i][j - 1], fxs[i + (1 << (j - 1))][j - 1]);
            fys[i][j] = min(fys[i][j - 1], fys[i + (1 << (j - 1))][j - 1]);
        }
    }
    for (int i = 1; i < n; i++) {
        int l = __lg(i);
        int maxx = max(fxb[1][l], fxb[i - (1 << l) + 1][l]);
        int maxy = max(fyb[1][l], fyb[i - (1 << l) + 1][l]);
        int minx = min(fxs[1][l], fxs[i - (1 << l) + 1][l]);
        int miny = min(fys[1][l], fys[i - (1 << l) + 1][l]);
        int l2 = __lg(n - i);
        int maxx2 = max(fxb[i + 1][l2], fxb[n - (1 << l2) + 1][l2]);
        int maxy2 = max(fyb[i + 1][l2], fyb[n - (1 << l2) + 1][l2]);
        int minx2 = min(fxs[i + 1][l2], fxs[n - (1 << l2) + 1][l2]);
        int miny2 = min(fys[i + 1][l2], fys[n - (1 << l2) + 1][l2]);
        ans = min(ans, (maxx - minx) * (maxy - miny) + (maxx2 - minx2) * (maxy2 - miny2));
    }
    cout << (maxnx - minnx) * (maxny - minny) - ans;
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...