2 min read

๋ฐฑ์ค€ 27068๋ฒˆ ์ด๋ฏธ์ง€ ๋ณด์ • ์ž‘์—…

๋ฌธ์ œ ๋งํฌ

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜ ๋ฌธ์ œ. ๋‘ ๊ตฌ์—ญ์˜ ์„ ๋ช…๋„์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋ฅผ midmid๋กœ ๋†“๊ณ  ์ด๋ถ„ํƒ์ƒ‰์„ ํ•˜๋ฉด ํ’€ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ๊ตฌ์—ญ์€ ๋ชจ๋‘ XX ์ดํ•˜์˜ ์„ ๋ช…๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๋•Œ ๊ตฌ์—ญ a,b(aโ‰คb)a, b (a\le b)์˜ ์„ ๋ช…๋„ ์ฐจ์ด๊ฐ€ midmid ์ด์ƒ์ด๋ผ๊ณ  ํ•ด ๋ณด์ž. ๋‘˜ ์ค‘ ์„ ๋ช…๋„๊ฐ€ ๋” ์ž‘์€ ๊ตฌ์—ญ์ธ aa๋ฅผ ๋ณด์ •ํ•ด์„œ XX๋กœ ํ‚ค์›Œ์•ผ ์ฐจ์ด๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Xโˆ’bX-b๊ฐ€ midmid๋ณด๋‹ค ํฌ๋‹ค๋ฉด bb๋„ ๋ณด์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ์„ ๋ช…๋„๊ฐ€ Xโˆ’midX - mid๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด๋ผ๋ฉด ๋ชจ๋‘ ๋ณด์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ฃผ์–ด์ง„ ์ด๋ฏธ์ง€๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ, ์ธ์ ‘ ๊ตฌ์—ญ๊ณผ ์„ ๋ช…๋„ ์ฐจ์ด๊ฐ€ midmid๋ณด๋‹ค ํฐ ๊ตฌ์—ญ์„ ์ฐพ๊ณ , ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ bfs ๋Œ๋ฆฌ๋ฉด์„œ ๋ณด์ •์„ ํ•ด ๋‚˜๊ฐ€์•ผํ•œ๋‹ค.

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;

constexpr int dy[4] = {1, -1, 0, 0}, dx[4] = {0, 0, 1, -1};
ll N, M, K, X, arr[500][500];

int bfs(int y, int x, ll diff, bool changed[500][500]) {
    int ret = 1;

    queue<pair<int, int>> q;
    q.emplace(y, x);
    changed[y][x] = true;
    while (!q.empty()) {
        auto [y, x] = q.front();
        q.pop();

        for (int i = 0; i < 4; i++) {
            int ny = y + dy[i], nx = x + dx[i];
            if (ny >= N || ny < 0 || nx >= M || nx < 0) continue;
            if (changed[ny][nx]) continue;
            if (arr[ny][nx] < X - diff) {
                changed[ny][nx] = true;
                q.emplace(ny, nx);
                ret++;
            }
        }

    }

    return ret;
}

int get_cnt(ll diff) {
    int ret = 0;
    bool changed[500][500] = {0};

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (arr[i][j] >= X - diff) continue;
            if (changed[i][j]) continue;
            for (int k = 0; k < 4; k++) {
                int ny = i + dy[k], nx = j + dx[k];
                if (ny >= N || ny < 0 || nx >= M || nx < 0) continue;
                if (abs(arr[i][j] - arr[ny][nx]) > diff) {
                    ret += bfs(i, j, diff, changed);
                    break;
                }
            }
        }
    }

    return ret;
}

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

    cin >> N >> M >> K >> X;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> arr[i][j];
        }
    }

    ll lo = 0, hi = X;
    while (lo <= hi) {
        ll mid = (lo + hi) / 2;
        int cnt = get_cnt(mid);
        // cout << mid << ' ' << cnt << '\n';
        if (cnt > K) lo = mid + 1;
        else hi = mid - 1;
    }

    cout << lo << '\n';

    return 0;
}

109,101810^9, 10^{18} ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ๋ฒ”์œ„๋กœ ์ฃผ์–ด์ง€๋ฉด ์ด๋ถ„ ํƒ์ƒ‰, ๋งค๊ฐœ ๋ณ€์ˆ˜ ํƒ์ƒ‰์„ ์˜์‹ฌํ•ด๋ณด๋„๋ก ํ•˜์ž.