Submission #498644

#TimeUsernameProblemLanguageResultExecution timeMemory
498644model_codeGardening (RMI21_gardening)C++17
100 / 100
54 ms924 KiB
// gardening_100_tamio.cpp
#include <bits/stdc++.h>
using namespace std;

// 38 6 36

template <typename T>
void build(int n, int m, int k, T it) {
    auto print_rect = [&](int i0, int i1, int j0, int j1) {
        for (int i = i0; i <= i1; ++i) it[i][j0] = it[i][j1] = k;
        for (int j = j0; j <= j1; ++j) it[i0][j] = it[i1][j] = k;
        --k;
    };

    auto do_all_sq = [&]() {
        for (int i = 0; i < n; ++i)
            for (int j = 0
            ; j < m; ++j)
                if (it[i][j] == 0) print_rect(i, i + 1, j, j + 1);
    };

    int critical = ((n - 2) / 2) * ((m - 2) / 2) + 1;

    if (k == (n / 2) * m / 2)
        do_all_sq();
    else if (k > critical) {
        int diff = k - critical, diff_i = min(diff, (n - 4) / 2),
            diff_j = diff - diff_i;

        print_rect(0, n - 2 * diff_i - 1, 0, m - 2 * diff_j - 1);
        do_all_sq();
    } else if (k == critical - 1) {
        if (n < m) {
            print_rect(0, n - 1, 0, m - 3);
            print_rect(1, 4, 1, 4);
            do_all_sq();
        } else {
            print_rect(0, n - 3, 0, m - 1);
            print_rect(1, 4, 1, 4);
            do_all_sq();
        }
    } else {
        print_rect(0, n - 1, 0, m - 1);

        for (int i = 0; i < n; ++i) ++it[i];

        build(n - 2, m - 2, k, it + 1);
    }
}

#ifdef TESTING

#define DEF_ENV(name) int env_##name = atoi(getenv(#name))

#endif

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;

#ifdef TESTING
    long long s = 0;

    DEF_ENV(N);
    DEF_ENV(M);
    DEF_ENV(eq);
#endif

    while (t--) {
        int n, m, k;
        cin >> n >> m >> k;

#ifdef TESTING
        assert(1 <= n && n <= 200000);
        assert(1 <= m && m <= 200000);
        assert(1 <= k && k <= (long long)n * m);

        assert(1 <= n && n <= env_N);
        assert(1 <= m && m <= env_M);
        assert(!env_eq || n == m);
#endif
        if (n % 2 == 1 || m % 2 == 1 || k < max(n / 2, m / 2) ||
            k > (n / 2) * (m / 2) || k == (n / 2) * (m / 2) - 1 ||
            (n == m && k == n / 2 + 1))
            cout << "NO\n";
        else {
            cout << "YES\n";
#ifdef TESTING
            s += (long long)n * m;
            assert(s <= 200000);
#endif
            vector<vector<int>> buf(n, vector<int>(m, 0));

            vector<vector<int>::iterator> its;

            transform(begin(buf), end(buf), back_inserter(its),
                      [](vector<int>& v) { return begin(v); });

            build(n, m, k, begin(its));

            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < m; ++j) cout << buf[i][j] << ' ';
                cout << '\n';
            }
            cout << flush;
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...