最后一个点WA求调
查看原帖
最后一个点WA求调
850808
william1118楼主2025/7/31 20:10
#include <iostream>
#include <algorithm>

using namespace std;
using ll = long long;

const int N = 1e6 + 1;

int a, b, c, q, lx[N], rx[N], ly[N], ry[N], lz[N], rz[N], v[N];
ll f[N], h[N];

int p(int i, int j, int k) {
    return max(0, ((i - 1) * b + (j - 1)) * c + ( k - 1 ) + 1);
}

void add(int x1, int x2, int y1, int y2, int z1, int z2, int w) {
    f[p(x1, y1, z1)] += 1LL * w;
    f[p(x2 + 1, y1, z1)] -= 1LL * w;
    f[p(x1, y2 + 1, z1)] -= 1LL * w;
    f[p(x2 + 1, y2 + 1, z1)] += 1LL * w;
    f[p(x1, y1, z2 + 1)] -= 1LL * w;
    f[p(x2 + 1, y1, z2 + 1)] += 1LL * w;
    f[p(x1, y2 + 1, z2 + 1)] += 1LL * w;
    f[p(x2 + 1, y2 + 1, z2 + 1)] -= 1LL * w;
}

void init() {
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                f[p(i, j, k)] = 0;
            }
        }
    }
}

void sum() {
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                f[p(i, j, k)] += f[p(i - 1, j, k)];
            }
        }
    }
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                f[p(i, j, k)] += f[p(i, j - 1, k)];
            }
        }
    }
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                f[p(i, j, k)] += f[p(i, j, k - 1)];
            }
        }
    }
}

bool check(int m) {
    init();
    for (int i = 1; i <= m; i++) {
        add(lx[i], rx[i], ly[i], ry[i], lz[i], rz[i], v[i]);
    }
    sum();
    int flag = 0;
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                flag |= f[p(i, j, k)] > h[p(i, j, k)];
            }
        }
    }
    return flag;
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> a >> b >> c >> q;
    for (int i = 1; i <= a; i++) {
        for (int j = 1; j <= b; j++) {
            for (int k = 1; k <= c; k++) {
                cin >> h[p(i, j, k)];
            }
        }
    }
    for (int i = 1; i <= q; i++) {
        cin >> lx[i] >> rx[i] >> ly[i] >> ry[i] >> lz[i] >> rz[i] >> v[i];
    }
    int l = 1, r = q, res = 1145141919;
    while (l <= r) {
        int m = l + r >> 1;
        if (check(m)) r = m - 1, res = m;
        else l = m + 1;
    }
    cout << (res == 1145141919 ? -1 : res);
    return 0;
}
2025/7/31 20:10
加载中...