#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
class Solution {
public :
// Helper to check if a valid intersection of coverage squares exists
bool check( int D, int n, int m, const std:: vector < std:: vector < int >> & initial_dist) {
// Find the required intersection bounds for the new delivery center.
int min_px_bound = 0 , max_px_bound = n - 1 ;
int min_py_bound = 0 , max_py_bound = m - 1 ;
bool has_critical_points = false ;
// Find all critical points (q) and tighten the bounds for our new center (p).
for ( int i = 0 ; i < n; ++ i) {
for ( int j = 0 ; j < m; ++ j) {
if ( initial_dist[ i] [ j] > D) {
has_critical_points = true ;
// A new center at (px, py) must cover (i, j).
// This means max(|px-i|, |py-j|) <= D, which implies:
// i - D <= px <= i + D
// j - D <= py <= j + D
min_px_bound = std:: max ( min_px_bound, i - D) ;
max_px_bound = std:: min ( max_px_bound, i + D) ;
min_py_bound = std:: max ( min_py_bound, j - D) ;
max_py_bound = std:: min ( max_py_bound, j + D) ;
}
}
}
if ( ! has_critical_points) {
return true ; // No points need covering, so D is achievable.
}
// If the intersection is valid, a point p exists that can cover all critical points.
return min_px_bound <= max_px_bound && min_py_bound <= max_py_bound;
}
int getMinInconvenience( std:: vector < std:: vector < int >> & grid) {
int n = grid.size ( ) ;
if ( n == 0 ) return 0 ;
int m = grid[ 0 ] .size ( ) ;
if ( m == 0 ) return 0 ;
// Phase 1: Preprocessing - Calculate initial distances
std:: vector < std:: vector < int >> initial_dist( n, std:: vector < int > ( m, - 1 ) ) ;
std:: queue < std:: pair < int , int >> q;
bool has_delivery_center = false ;
for ( int i = 0 ; i < n; ++ i) {
for ( int j = 0 ; j < m; ++ j) {
if ( grid[ i] [ j] == 1 ) {
q.push ( { i, j} ) ;
initial_dist[ i] [ j] = 0 ;
has_delivery_center = true ;
}
}
}
// If no delivery centers exist, we must place one.
// We can skip the BFS and go straight to binary search.
if ( has_delivery_center) {
int dr[ ] = { - 1 , - 1 , - 1 , 0 , 0 , 1 , 1 , 1 } ;
int dc[ ] = { - 1 , 0 , 1 , - 1 , 1 , - 1 , 0 , 1 } ;
int head = 0 ;
while ( ! q.empty ( ) ) {
std:: pair < int ,int > curr = q.front ( ) ;
q.pop ( ) ;
for ( int i= 0 ; i< 8 ; ++ i) {
int nr = curr.first + dr[ i] ;
int nc = curr.second + dc[ i] ;
if ( nr >= 0 && nr < n && nc >= 0 && nc < m && initial_dist[ nr] [ nc] == - 1 ) {
initial_dist[ nr] [ nc] = initial_dist[ curr.first ] [ curr.second ] + 1 ;
q.push ( { nr, nc} ) ;
}
}
}
} else {
// If no centers, treat initial distances as infinite
for ( int i = 0 ; i < n; ++ i) {
for ( int j = 0 ; j < m; ++ j) {
initial_dist[ i] [ j] = n + m; // A value larger than any possible distance
}
}
}
// Phase 2: Binary Search for the minimum possible inconvenience D
int low = 0 , high = n + m, ans = n + m;
while ( low <= high) {
int mid = low + ( high - low) / 2 ;
if ( check( mid, n, m, initial_dist) ) {
// It's possible to achieve inconvenience 'mid'. Try for an even smaller one.
ans = mid;
high = mid - 1 ;
} else {
// Not possible. We need to allow for a larger inconvenience.
low = mid + 1 ;
}
}
return ans;
}
} ;
// Example Usage
int main( ) {
Solution sol;
// Sample Case 0 from problem description
std:: vector < std:: vector < int >> grid1 = {
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 }
} ;
std:: cout << "Sample Case 0:" << std:: endl ;
std:: cout << "Expected Output: 2" << std:: endl ;
std:: cout << "Actual Output: " << sol.getMinInconvenience ( grid1) << std:: endl ;
std:: cout << "---------------------" << std:: endl ;
// Sample Case 1 from problem description
std:: vector < std:: vector < int >> grid2 = { { 0 } } ;
std:: cout << "Sample Case 1:" << std:: endl ;
std:: cout << "Expected Output: 0" << std:: endl ;
std:: cout << "Actual Output: " << sol.getMinInconvenience ( grid2) << std:: endl ;
std:: cout << "---------------------" << std:: endl ;
// First example from problem description
std:: vector < std:: vector < int >> grid3 = {
{ 0 , 0 , 0 , 1 } ,
{ 0 , 0 , 0 , 1 }
} ;
std:: cout << "Problem Description Example:" << std:: endl ;
std:: cout << "Expected Output: 1" << std:: endl ;
std:: cout << "Actual Output: " << sol.getMinInconvenience ( grid3) << std:: endl ;
std:: cout << "---------------------" << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CgpjbGFzcyBTb2x1dGlvbiB7CnB1YmxpYzoKICAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBhIHZhbGlkIGludGVyc2VjdGlvbiBvZiBjb3ZlcmFnZSBzcXVhcmVzIGV4aXN0cwogICAgYm9vbCBjaGVjayhpbnQgRCwgaW50IG4sIGludCBtLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+PiYgaW5pdGlhbF9kaXN0KSB7CiAgICAgICAgLy8gRmluZCB0aGUgcmVxdWlyZWQgaW50ZXJzZWN0aW9uIGJvdW5kcyBmb3IgdGhlIG5ldyBkZWxpdmVyeSBjZW50ZXIuCiAgICAgICAgaW50IG1pbl9weF9ib3VuZCA9IDAsIG1heF9weF9ib3VuZCA9IG4gLSAxOwogICAgICAgIGludCBtaW5fcHlfYm91bmQgPSAwLCBtYXhfcHlfYm91bmQgPSBtIC0gMTsKCiAgICAgICAgYm9vbCBoYXNfY3JpdGljYWxfcG9pbnRzID0gZmFsc2U7CgogICAgICAgIC8vIEZpbmQgYWxsIGNyaXRpY2FsIHBvaW50cyAocSkgYW5kIHRpZ2h0ZW4gdGhlIGJvdW5kcyBmb3Igb3VyIG5ldyBjZW50ZXIgKHApLgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbF9kaXN0W2ldW2pdID4gRCkgewogICAgICAgICAgICAgICAgICAgIGhhc19jcml0aWNhbF9wb2ludHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIC8vIEEgbmV3IGNlbnRlciBhdCAocHgsIHB5KSBtdXN0IGNvdmVyIChpLCBqKS4KICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIG1heCh8cHgtaXwsIHxweS1qfCkgPD0gRCwgd2hpY2ggaW1wbGllczoKICAgICAgICAgICAgICAgICAgICAvLyBpIC0gRCA8PSBweCA8PSBpICsgRAogICAgICAgICAgICAgICAgICAgIC8vIGogLSBEIDw9IHB5IDw9IGogKyBECiAgICAgICAgICAgICAgICAgICAgbWluX3B4X2JvdW5kID0gc3RkOjptYXgobWluX3B4X2JvdW5kLCBpIC0gRCk7CiAgICAgICAgICAgICAgICAgICAgbWF4X3B4X2JvdW5kID0gc3RkOjptaW4obWF4X3B4X2JvdW5kLCBpICsgRCk7CiAgICAgICAgICAgICAgICAgICAgbWluX3B5X2JvdW5kID0gc3RkOjptYXgobWluX3B5X2JvdW5kLCBqIC0gRCk7CiAgICAgICAgICAgICAgICAgICAgbWF4X3B5X2JvdW5kID0gc3RkOjptaW4obWF4X3B5X2JvdW5kLCBqICsgRCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghaGFzX2NyaXRpY2FsX3BvaW50cykgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gTm8gcG9pbnRzIG5lZWQgY292ZXJpbmcsIHNvIEQgaXMgYWNoaWV2YWJsZS4KICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBpbnRlcnNlY3Rpb24gaXMgdmFsaWQsIGEgcG9pbnQgcCBleGlzdHMgdGhhdCBjYW4gY292ZXIgYWxsIGNyaXRpY2FsIHBvaW50cy4KICAgICAgICByZXR1cm4gbWluX3B4X2JvdW5kIDw9IG1heF9weF9ib3VuZCAmJiBtaW5fcHlfYm91bmQgPD0gbWF4X3B5X2JvdW5kOwogICAgfQoKICAgIGludCBnZXRNaW5JbmNvbnZlbmllbmNlKHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+JiBncmlkKSB7CiAgICAgICAgaW50IG4gPSBncmlkLnNpemUoKTsKICAgICAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKICAgICAgICBpbnQgbSA9IGdyaWRbMF0uc2l6ZSgpOwogICAgICAgIGlmIChtID09IDApIHJldHVybiAwOwoKICAgICAgICAvLyBQaGFzZSAxOiBQcmVwcm9jZXNzaW5nIC0gQ2FsY3VsYXRlIGluaXRpYWwgZGlzdGFuY2VzCiAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gaW5pdGlhbF9kaXN0KG4sIHN0ZDo6dmVjdG9yPGludD4obSwgLTEpKTsKICAgICAgICBzdGQ6OnF1ZXVlPHN0ZDo6cGFpcjxpbnQsIGludD4+IHE7CiAgICAgICAgYm9vbCBoYXNfZGVsaXZlcnlfY2VudGVyID0gZmFsc2U7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgICAgICBpZiAoZ3JpZFtpXVtqXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHtpLCBqfSk7CiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9kaXN0W2ldW2pdID0gMDsKICAgICAgICAgICAgICAgICAgICBoYXNfZGVsaXZlcnlfY2VudGVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSWYgbm8gZGVsaXZlcnkgY2VudGVycyBleGlzdCwgd2UgbXVzdCBwbGFjZSBvbmUuCiAgICAgICAgLy8gV2UgY2FuIHNraXAgdGhlIEJGUyBhbmQgZ28gc3RyYWlnaHQgdG8gYmluYXJ5IHNlYXJjaC4KICAgICAgICBpZiAoaGFzX2RlbGl2ZXJ5X2NlbnRlcikgewogICAgICAgICAgICBpbnQgZHJbXSA9IHstMSwgLTEsIC0xLCAwLCAwLCAxLCAxLCAxfTsKICAgICAgICAgICAgaW50IGRjW10gPSB7LTEsIDAsIDEsIC0xLCAxLCAtMSwgMCwgMX07CiAgICAgICAgICAgIGludCBoZWFkID0gMDsKICAgICAgICAgICAgd2hpbGUoIXEuZW1wdHkoKSl7CiAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50LGludD4gY3VyciA9IHEuZnJvbnQoKTsKICAgICAgICAgICAgICAgIHEucG9wKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPDg7ICsraSl7CiAgICAgICAgICAgICAgICAgICAgaW50IG5yID0gY3Vyci5maXJzdCArIGRyW2ldOwogICAgICAgICAgICAgICAgICAgIGludCBuYyA9IGN1cnIuc2Vjb25kICsgZGNbaV07CgogICAgICAgICAgICAgICAgICAgIGlmKG5yID49IDAgJiYgbnIgPCBuICYmIG5jID49IDAgJiYgbmMgPCBtICYmIGluaXRpYWxfZGlzdFtucl1bbmNdID09IC0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9kaXN0W25yXVtuY10gPSBpbml0aWFsX2Rpc3RbY3Vyci5maXJzdF1bY3Vyci5zZWNvbmRdICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHtuciwgbmN9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSWYgbm8gY2VudGVycywgdHJlYXQgaW5pdGlhbCBkaXN0YW5jZXMgYXMgaW5maW5pdGUKICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgICAgICAgICAgICAgIGluaXRpYWxfZGlzdFtpXVtqXSA9IG4gKyBtOyAvLyBBIHZhbHVlIGxhcmdlciB0aGFuIGFueSBwb3NzaWJsZSBkaXN0YW5jZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQaGFzZSAyOiBCaW5hcnkgU2VhcmNoIGZvciB0aGUgbWluaW11bSBwb3NzaWJsZSBpbmNvbnZlbmllbmNlIEQKICAgICAgICBpbnQgbG93ID0gMCwgaGlnaCA9IG4gKyBtLCBhbnMgPSBuICsgbTsKICAgICAgICAKICAgICAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKICAgICAgICAgICAgaW50IG1pZCA9IGxvdyArIChoaWdoIC0gbG93KSAvIDI7CiAgICAgICAgICAgIGlmIChjaGVjayhtaWQsIG4sIG0sIGluaXRpYWxfZGlzdCkpIHsKICAgICAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgdG8gYWNoaWV2ZSBpbmNvbnZlbmllbmNlICdtaWQnLiBUcnkgZm9yIGFuIGV2ZW4gc21hbGxlciBvbmUuCiAgICAgICAgICAgICAgICBhbnMgPSBtaWQ7CiAgICAgICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5vdCBwb3NzaWJsZS4gV2UgbmVlZCB0byBhbGxvdyBmb3IgYSBsYXJnZXIgaW5jb252ZW5pZW5jZS4KICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBhbnM7CiAgICB9Cn07Ci8vIEV4YW1wbGUgVXNhZ2UKaW50IG1haW4oKSB7CiAgICBTb2x1dGlvbiBzb2w7CgogICAgLy8gU2FtcGxlIENhc2UgMCBmcm9tIHByb2JsZW0gZGVzY3JpcHRpb24KICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+IGdyaWQxID0gewogICAgICAgIHswLCAwLCAwLCAwfSwKICAgICAgICB7MCwgMCwgMCwgMH0sCiAgICAgICAgezAsIDAsIDAsIDB9CiAgICB9OwogICAgc3RkOjpjb3V0IDw8ICJTYW1wbGUgQ2FzZSAwOiIgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJFeHBlY3RlZCBPdXRwdXQ6IDIiIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiQWN0dWFsIE91dHB1dDogICAiIDw8IHNvbC5nZXRNaW5JbmNvbnZlbmllbmNlKGdyaWQxKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgc3RkOjplbmRsOwoKCiAgICAvLyBTYW1wbGUgQ2FzZSAxIGZyb20gcHJvYmxlbSBkZXNjcmlwdGlvbgogICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gZ3JpZDIgPSB7ezB9fTsKICAgIHN0ZDo6Y291dCA8PCAiU2FtcGxlIENhc2UgMToiIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiRXhwZWN0ZWQgT3V0cHV0OiAwIiA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIkFjdHVhbCBPdXRwdXQ6ICAgIiA8PCBzb2wuZ2V0TWluSW5jb252ZW5pZW5jZShncmlkMikgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IHN0ZDo6ZW5kbDsKCiAgICAvLyBGaXJzdCBleGFtcGxlIGZyb20gcHJvYmxlbSBkZXNjcmlwdGlvbgogICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4gZ3JpZDMgPSB7CiAgICAgICAgezAsIDAsIDAsIDF9LAogICAgICAgIHswLCAwLCAwLCAxfQogICAgfTsKICAgIHN0ZDo6Y291dCA8PCAiUHJvYmxlbSBEZXNjcmlwdGlvbiBFeGFtcGxlOiIgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJFeHBlY3RlZCBPdXRwdXQ6IDEiIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiQWN0dWFsIE91dHB1dDogICAiIDw8IHNvbC5nZXRNaW5JbmNvbnZlbmllbmNlKGdyaWQzKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9