Hướng dẫn cho Summer Contest #02 - Khu vườn ánh sáng


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: ledinhbaonam, uia

Do authors quá lười viết hướng dẫn nên chỉ để code thôi nhé! Thông cảm~~~

C++
#include <bits/stdc++.h>
using namespace std;
#define int long long

int m, n, q;
int a[5][40005];
int st[5][4][160005];

signed main() {
    freopen("khuvuonanhsang.inp", "r", stdin);
    freopen("khuvuonanhsang.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> m >> n >> q;
    for (int i = 0; i < m; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> a[i][j];
        }
    }
    auto cost = [](int k, int x, int y) -> int {
        int mx = -1000000000, mn = 1000000000;
        for (int i = x; i < x + k; i++) {
            for (int j = y; j < y + k; j++) {
                if (a[i][j] > mx) mx = a[i][j];
                if (a[i][j] < mn) mn = a[i][j];
            }
        }
        return mx - mn;
    };
    auto build = [&](auto& self, int k, int x, int id, int l, int r) -> void {
        if (l == r) {
            st[k][x][id] = (l <= n - k + 1) ? cost(k, x, l) : 2000000000;
            return;
        }
        int mid = (l + r) >> 1;
        self(self, k, x, id << 1, l, mid);
        self(self, k, x, id << 1 | 1, mid + 1, r);
        st[k][x][id] = min(st[k][x][id << 1], st[k][x][id << 1 | 1]);
    };
    auto upd = [&](auto& self, int k, int x, int id, int l, int r, int p, int v) -> void {
        if (l == r) {
            st[k][x][id] = v;
            return;
        }
        int mid = (l + r) >> 1;
        if (p <= mid) self(self, k, x, id << 1, l, mid, p, v);
        else self(self, k, x, id << 1 | 1, mid + 1, r, p, v);
        st[k][x][id] = min(st[k][x][id << 1], st[k][x][id << 1 | 1]);
    };
    for (int k = 1; k <= m; k++) {
        for (int i = 0; i <= m - k; i++) {
            build(build, k, i, 1, 1, n);
        }
    }
    while (q--) {
        int t;
        cin >> t;
        if (t == 1) {
            int x, y, v;
            cin >> x >> y >> v;
            x--;
            a[x][y] = v;
            for (int k = 1; k <= m; k++) {
                for (int i = 0; i <= m - k; i++) {
                    if (x >= i && x < i + k) {
                        int l = max(1LL, y - k + 1);
                        int r = min(y, n - k + 1);
                        for (int j = l; j <= r; j++) {
                            upd(upd, k, i, 1, 1, n, j, cost(k, i, j));
                        }
                    }
                }
            }
        } else {
            int l;
            cin >> l;
            int ans = 0;
            for (int k = min(m, n); k >= 1; k--) {
                int mn = 2000000000;
                for (int i = 0; i <= m - k; i++) {
                    if (st[k][i][1] < mn) mn = st[k][i][1];
                }
                if (mn <= l) {
                    ans = k;
                    break;
                }
            }
            cout << ans << '\n';
        }
    }
    return 0;
}

Bình luận (2)

Mới nhất
Tải bình luận...