/*
QUESTION 10: Placing One More Delivery Hub
Problem Statement:
You are given a binary grid.
1 means there is already a delivery hub.
0 means the cell is empty.
You must place exactly one new hub on an empty cell.
Distance between cells is:
max(abs(row1 - row2), abs(col1 - col2))
For every cell, inconvenience is the distance to the nearest hub.
Return the smallest possible maximum inconvenience after adding one hub.
Hard Constraints:
1 <= rows, cols
rows * cols <= 200000
At least one existing hub exists.
At least one empty cell exists.
Example:
grid =
[
[1, 0],
[0, 0]
]
Expected Output:
1
Explanation:
Place the new hub at the bottom-right cell.
Every cell becomes within distance 1 from some hub.
Brute Force:
Try every empty cell as the new hub.
For each placement, compute nearest hub distance for every grid cell.
Time Complexity:
O((rows * cols)^2)
Optimized Approach:
First compute distance from every cell to nearest existing hub using multi-source BFS
in 8 directions.
Then binary search answer D.
For every cell whose current distance is greater than D:
the new hub must be within distance D from it.
Each such cell creates a rectangle of possible hub positions.
Intersect all rectangles.
If the final intersection contains an empty cell, D is possible.
Time Complexity:
O(rows * cols * log(max(rows, cols)))
Space Complexity:
O(rows * cols)
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minimumInconvenience(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
const int INF = 1e9;
vector<vector<int>> dist(n, vector<int>(m, INF));
queue<pair<int, int>> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 1) {
dist[i][j] = 0;
q.push({i, j});
}
}
}
vector<pair<int, int>> dirs = {
{1, 0}, {-1, 0}, {0, 1}, {0, -1},
{1, 1}, {1, -1}, {-1, 1}, {-1, -1}
};
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (auto [dx, dy] : dirs) {
int nx = x + dx;
int ny = y + dy;
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
if (dist[nx][ny] > dist[x][y] + 1) {
dist[nx][ny] = dist[x][y] + 1;
q.push({nx, ny});
}
}
}
}
vector<vector<int>> pref(n + 1, vector<int>(m + 1, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
pref[i + 1][j + 1] =
pref[i][j + 1] +
pref[i + 1][j] -
pref[i][j] +
(grid[i][j] == 0);
}
}
auto emptyCount = [&](int x1, int y1, int x2, int y2) {
if (x1 > x2 || y1 > y2) return 0;
return pref[x2 + 1][y2 + 1]
- pref[x1][y2 + 1]
- pref[x2 + 1][y1]
+ pref[x1][y1];
};
auto can = [&](int D) {
int lx = 0, rx = n - 1;
int ly = 0, ry = m - 1;
bool hasBad = false;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (dist[i][j] > D) {
hasBad = true;
lx = max(lx, i - D);
rx = min(rx, i + D);
ly = max(ly, j - D);
ry = min(ry, j + D);
}
}
}
if (!hasBad) return true;
if (lx > rx || ly > ry) return false;
return emptyCount(lx, ly, rx, ry) > 0;
};
int low = 0;
int high = max(n, m);
int ans = high;
while (low <= high) {
int mid = low + (high - low) / 2;
if (can(mid)) {
ans = mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
return ans;
}
};
int main() {
Solution sol;
vector<vector<int>> grid = {
{1, 0},
{0, 0}
};
cout << sol.minimumInconvenience(grid) << endl;
return 0;
}
LyoKUVVFU1RJT04gMTA6IFBsYWNpbmcgT25lIE1vcmUgRGVsaXZlcnkgSHViCgpQcm9ibGVtIFN0YXRlbWVudDoKWW91IGFyZSBnaXZlbiBhIGJpbmFyeSBncmlkLgoKMSBtZWFucyB0aGVyZSBpcyBhbHJlYWR5IGEgZGVsaXZlcnkgaHViLgowIG1lYW5zIHRoZSBjZWxsIGlzIGVtcHR5LgoKWW91IG11c3QgcGxhY2UgZXhhY3RseSBvbmUgbmV3IGh1YiBvbiBhbiBlbXB0eSBjZWxsLgoKRGlzdGFuY2UgYmV0d2VlbiBjZWxscyBpczoKbWF4KGFicyhyb3cxIC0gcm93MiksIGFicyhjb2wxIC0gY29sMikpCgpGb3IgZXZlcnkgY2VsbCwgaW5jb252ZW5pZW5jZSBpcyB0aGUgZGlzdGFuY2UgdG8gdGhlIG5lYXJlc3QgaHViLgoKUmV0dXJuIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBtYXhpbXVtIGluY29udmVuaWVuY2UgYWZ0ZXIgYWRkaW5nIG9uZSBodWIuCgpIYXJkIENvbnN0cmFpbnRzOgoxIDw9IHJvd3MsIGNvbHMKcm93cyAqIGNvbHMgPD0gMjAwMDAwCkF0IGxlYXN0IG9uZSBleGlzdGluZyBodWIgZXhpc3RzLgpBdCBsZWFzdCBvbmUgZW1wdHkgY2VsbCBleGlzdHMuCgpFeGFtcGxlOgpncmlkID0KWwogIFsxLCAwXSwKICBbMCwgMF0KXQoKRXhwZWN0ZWQgT3V0cHV0OgoxCgpFeHBsYW5hdGlvbjoKUGxhY2UgdGhlIG5ldyBodWIgYXQgdGhlIGJvdHRvbS1yaWdodCBjZWxsLgpFdmVyeSBjZWxsIGJlY29tZXMgd2l0aGluIGRpc3RhbmNlIDEgZnJvbSBzb21lIGh1Yi4KCkJydXRlIEZvcmNlOgpUcnkgZXZlcnkgZW1wdHkgY2VsbCBhcyB0aGUgbmV3IGh1Yi4KRm9yIGVhY2ggcGxhY2VtZW50LCBjb21wdXRlIG5lYXJlc3QgaHViIGRpc3RhbmNlIGZvciBldmVyeSBncmlkIGNlbGwuCgpUaW1lIENvbXBsZXhpdHk6Ck8oKHJvd3MgKiBjb2xzKV4yKQoKT3B0aW1pemVkIEFwcHJvYWNoOgpGaXJzdCBjb21wdXRlIGRpc3RhbmNlIGZyb20gZXZlcnkgY2VsbCB0byBuZWFyZXN0IGV4aXN0aW5nIGh1YiB1c2luZyBtdWx0aS1zb3VyY2UgQkZTCmluIDggZGlyZWN0aW9ucy4KClRoZW4gYmluYXJ5IHNlYXJjaCBhbnN3ZXIgRC4KCkZvciBldmVyeSBjZWxsIHdob3NlIGN1cnJlbnQgZGlzdGFuY2UgaXMgZ3JlYXRlciB0aGFuIEQ6CnRoZSBuZXcgaHViIG11c3QgYmUgd2l0aGluIGRpc3RhbmNlIEQgZnJvbSBpdC4KCkVhY2ggc3VjaCBjZWxsIGNyZWF0ZXMgYSByZWN0YW5nbGUgb2YgcG9zc2libGUgaHViIHBvc2l0aW9ucy4KSW50ZXJzZWN0IGFsbCByZWN0YW5nbGVzLgoKSWYgdGhlIGZpbmFsIGludGVyc2VjdGlvbiBjb250YWlucyBhbiBlbXB0eSBjZWxsLCBEIGlzIHBvc3NpYmxlLgoKVGltZSBDb21wbGV4aXR5OgpPKHJvd3MgKiBjb2xzICogbG9nKG1heChyb3dzLCBjb2xzKSkpCgpTcGFjZSBDb21wbGV4aXR5OgpPKHJvd3MgKiBjb2xzKQoqLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTb2x1dGlvbiB7CnB1YmxpYzoKICAgIGludCBtaW5pbXVtSW5jb252ZW5pZW5jZSh2ZWN0b3I8dmVjdG9yPGludD4+JiBncmlkKSB7CiAgICAgICAgaW50IG4gPSBncmlkLnNpemUoKTsKICAgICAgICBpbnQgbSA9IGdyaWRbMF0uc2l6ZSgpOwoKICAgICAgICBjb25zdCBpbnQgSU5GID0gMWU5OwoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGRpc3QobiwgdmVjdG9yPGludD4obSwgSU5GKSk7CiAgICAgICAgcXVldWU8cGFpcjxpbnQsIGludD4+IHE7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXVtqXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgZGlzdFtpXVtqXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHtpLCBqfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gZGlycyA9IHsKICAgICAgICAgICAgezEsIDB9LCB7LTEsIDB9LCB7MCwgMX0sIHswLCAtMX0sCiAgICAgICAgICAgIHsxLCAxfSwgezEsIC0xfSwgey0xLCAxfSwgey0xLCAtMX0KICAgICAgICB9OwoKICAgICAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgICAgICBhdXRvIFt4LCB5XSA9IHEuZnJvbnQoKTsKICAgICAgICAgICAgcS5wb3AoKTsKCiAgICAgICAgICAgIGZvciAoYXV0byBbZHgsIGR5XSA6IGRpcnMpIHsKICAgICAgICAgICAgICAgIGludCBueCA9IHggKyBkeDsKICAgICAgICAgICAgICAgIGludCBueSA9IHkgKyBkeTsKCiAgICAgICAgICAgICAgICBpZiAobnggPj0gMCAmJiBueCA8IG4gJiYgbnkgPj0gMCAmJiBueSA8IG0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdFtueF1bbnldID4gZGlzdFt4XVt5XSArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdFtueF1bbnldID0gZGlzdFt4XVt5XSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHEucHVzaCh7bngsIG55fSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHByZWYobiArIDEsIHZlY3RvcjxpbnQ+KG0gKyAxLCAwKSk7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7CiAgICAgICAgICAgICAgICBwcmVmW2kgKyAxXVtqICsgMV0gPQogICAgICAgICAgICAgICAgICAgIHByZWZbaV1baiArIDFdICsKICAgICAgICAgICAgICAgICAgICBwcmVmW2kgKyAxXVtqXSAtCiAgICAgICAgICAgICAgICAgICAgcHJlZltpXVtqXSArCiAgICAgICAgICAgICAgICAgICAgKGdyaWRbaV1bal0gPT0gMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGF1dG8gZW1wdHlDb3VudCA9IFsmXShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKICAgICAgICAgICAgaWYgKHgxID4geDIgfHwgeTEgPiB5MikgcmV0dXJuIDA7CgogICAgICAgICAgICByZXR1cm4gcHJlZlt4MiArIDFdW3kyICsgMV0KICAgICAgICAgICAgICAgICAtIHByZWZbeDFdW3kyICsgMV0KICAgICAgICAgICAgICAgICAtIHByZWZbeDIgKyAxXVt5MV0KICAgICAgICAgICAgICAgICArIHByZWZbeDFdW3kxXTsKICAgICAgICB9OwoKICAgICAgICBhdXRvIGNhbiA9IFsmXShpbnQgRCkgewogICAgICAgICAgICBpbnQgbHggPSAwLCByeCA9IG4gLSAxOwogICAgICAgICAgICBpbnQgbHkgPSAwLCByeSA9IG0gLSAxOwoKICAgICAgICAgICAgYm9vbCBoYXNCYWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgICAgICAgICAgICAgIGlmIChkaXN0W2ldW2pdID4gRCkgewogICAgICAgICAgICAgICAgICAgICAgICBoYXNCYWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgbHggPSBtYXgobHgsIGkgLSBEKTsKICAgICAgICAgICAgICAgICAgICAgICAgcnggPSBtaW4ocngsIGkgKyBEKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGx5ID0gbWF4KGx5LCBqIC0gRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ5ID0gbWluKHJ5LCBqICsgRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWhhc0JhZCkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGlmIChseCA+IHJ4IHx8IGx5ID4gcnkpIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgIHJldHVybiBlbXB0eUNvdW50KGx4LCBseSwgcngsIHJ5KSA+IDA7CiAgICAgICAgfTsKCiAgICAgICAgaW50IGxvdyA9IDA7CiAgICAgICAgaW50IGhpZ2ggPSBtYXgobiwgbSk7CiAgICAgICAgaW50IGFucyA9IGhpZ2g7CgogICAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICAgICAgICBpbnQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpIC8gMjsKCiAgICAgICAgICAgIGlmIChjYW4obWlkKSkgewogICAgICAgICAgICAgICAgYW5zID0gbWlkOwogICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYW5zOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBTb2x1dGlvbiBzb2w7CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBncmlkID0gewogICAgICAgIHsxLCAwfSwKICAgICAgICB7MCwgMH0KICAgIH07CgogICAgY291dCA8PCBzb2wubWluaW11bUluY29udmVuaWVuY2UoZ3JpZCkgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==