답안 #632563

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
632563 2022-08-20T10:44:33 Z boris_mihov Gardening (RMI21_gardening) C++17
0 / 100
20 ms 5460 KB
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
#include <queue>

typedef long long llong;
const int MAXN = 200000 + 10;
const int INF  = 1e9;

int n, m, k;
int sx, sy, ex, ey, curr;
std::vector <int> t[MAXN];
void putFrame()
{
    for (int i = sx ; i <= ex ; ++i)
    {
        t[i][sy] = curr;
        t[i][ey] = curr;
    }

    for (int i = sy ; i <= ey ; ++i)
    {
        t[sx][i] = curr;
        t[ex][i] = curr;
    }

    sx++;
    sy++;
    ex--;
    ey--;
    curr++;
}

void putRow()
{
    for (int i = 0 ; i < (ey - sy + 1) / 2 ; ++i)
    {
        t[sx][sy + 2*i] = curr;
        t[sx][sy + 2*i + 1] = curr;
        t[sx + 1][sy + 2*i] = curr;
        t[sx + 1][sy + 2*i + 1] = curr;
        curr++;
    }

    sx += 2;
}

void putCol()
{
    for (int i = 0 ; i < (ex - sx + 1) / 2 ; ++i)
    {
        t[sx + 2*i][sy] = curr;
        t[sx + 2*i + 1][sy] = curr;
        t[sx + 2*i][sy + 1] = curr;
        t[sx + 2*i + 1][sy + 1] = curr;
        curr++;
    }

    sy += 2;
}

void solve()
{
    if (n&1 || m&1)
    {
        std::cout << "NO\n";
        return;
    }

    if (k < std::min(n/2, m/2) || n*m/4 < k)
    {
        std::cout << "NO\n";
        return;
    }

    for (int i = 1 ; i <= n ; ++i)
    {
        t[i].clear();
        t[i].resize(m + 1);
    }

    int realN = n;
    int realM = m;
    int realK = k;
    sx = 1;
    sy = 1;
    ex = n;
    ey = m;
    curr = 1;
    bool success = true;

    while (k >= 1)
    {
        if (n >= m && k - (ey - sy + 1) / 2 >= std::min((n-2)/2, m/2)) 
        {
            int newK = k - (ey - sy + 1) / 2;
            putRow();
            n -= 2;
            k = newK;
            continue;
        }

        if (m > n && k - (ex - sx + 1) / 2 >= std::min(n/2, (m-2)/2)) 
        {
            int newK = k - (ex - sx + 1) / 2;
            putCol();
            m -= 2;
            k = newK;
            continue;
        }

        if (k - (ey - sy + 1) / 2 >= std::min((n-2)/2, m/2)) 
        {
            int newK = k - (ey - sy + 1) / 2;
            putRow();
            n -= 2;
            k = newK;
            continue;
        }

        if (k - (ex - sx + 1) / 2 >= std::min(n/2, (m-2)/2)) 
        {
            int newK = k - (ex - sx + 1) / 2;
            putCol();
            m -= 2;
            k = newK;
            continue;
        }
        
        success &= !(std::min(n, m) == 2 && n != m);
        putFrame();
        n -= 2;
        m -= 2;
        k--;
    }

    if (!success)
    {
        n = realN;
        m = realM;
        k = realK;
        sx = 1;
        sy = 1;
        ex = n;
        ey = m;
        curr = 1;
        
        if ((n-2)*(m-2)/4 < k-1)
        {
            std::cout << "NO\n";
            return;
        }

        putFrame();
        n -= 2;
        m -= 2;
        k--;

        while (k >= 1)
        {
            if (n >= m && k - (ey - sy + 1) / 2 >= std::min((n-2)/2, m/2)) 
            {
                int newK = k - (ey - sy + 1) / 2;
                putRow();
                n -= 2;
                k = newK;
                continue;
            }

            if (m > n && k - (ex - sx + 1) / 2 >= std::min(n/2, (m-2)/2)) 
            {
                int newK = k - (ex - sx + 1) / 2;
                putCol();
                m -= 2;
                k = newK;
                continue;
            }

            if (k - (ey - sy + 1) / 2 >= std::min((n-2)/2, m/2)) 
            {
                int newK = k - (ey - sy + 1) / 2;
                putRow();
                n -= 2;
                k = newK;
                continue;
            }

            if (k - (ex - sx + 1) / 2 >= std::min(n/2, (m-2)/2)) 
            {
                int newK = k - (ex - sx + 1) / 2;
                putCol();
                m -= 2;
                k = newK;
                continue;
            }
            
            if (n != m && std::min(n, m) == 2)
            {
                std::cout << "NO\n";
                return;
            }

            putFrame();
            n -= 2;
            m -= 2;
            k--;
        }
    }

    std::cout << "YES\n";
    for (int i = 1 ; i <= realN ; ++i)
    {
        for (int j = 1 ; j <= realM ; ++j)
        {
            std::cout << t[i][j] << ' ';
        }

        std::cout << '\n';
    }
}

void read()
{
    std::cin >> n >> m >> k;
}

void fastIO()
{
    std::ios_base :: sync_with_stdio(0);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
}

int tests;
int main()
{
    fastIO();
    std::cin >> tests;

    while (tests--)
    {
        read();
        solve();
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Failed 20 ms 5460 KB Incorrect output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Failed 20 ms 5460 KB Incorrect output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Failed 20 ms 5460 KB Incorrect output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Failed 9 ms 5300 KB Incorrect output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Failed 5 ms 5076 KB Incorrect output
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Failed 20 ms 5460 KB Incorrect output
2 Halted 0 ms 0 KB -