Use this to learn the idea, then write your own version.
123 45class Solution {6public:7 int maxPartitionFactor(vector<vector<int>>& points) {8 const auto& dist = [&](auto u, auto v) {9 return abs(points[u][0] - points[v][0]) + abs(points[u][1] - points[v][1]);10 };11 12 vector<tuple<int, int, int>> sorted_dists;13 for (int u = 0; u < size(points); ++u) {14 for (int v = u + 1; v < size(points); ++v) {15 sorted_dists.emplace_back(dist(u, v), u, v);16 }17 }18 sort(begin(sorted_dists), end(sorted_dists));19 UnionFind uf(size(points));20 for (const auto& [d, u, v] : sorted_dists) {21 if (!uf.union_set(u, v)) {22 return d;23 }24 }25 return 0;26 }27 28private:29 class UnionFind {30 public:31 UnionFind(int n)32 : set_(n)33 , rank_(n)34 , parity_(n) {35 iota(set_.begin(), set_.end(), 0);36 }37 38 int find_set(int x) {39 vector<int> stk;40 while (set_[x] != x) { 41 stk.emplace_back(x);42 x = set_[x];43 }44 while (!empty(stk)) {45 const int y = stk.back(); stk.pop_back();46 parity_[y] ^= parity_[set_[y]]; 47 set_[y] = x;48 }49 return x;50 }51 52 bool union_set(int x, int y) {53 int ox = x, oy = y;54 x = find_set(x), y = find_set(y);55 if (x == y) {56 return parity_[ox] != parity_[oy]; 57 }58 if (rank_[x] > rank_[y]) {59 swap(x, y);60 }61 if (rank_[x] == rank_[y]) {62 ++rank_[y];63 }64 set_[x] = y; 65 parity_[x] = parity_[ox] ^ parity_[oy] ^ 1;66 return true;67 }68 69 private:70 vector<int> set_;71 vector<int> rank_;72 vector<int> parity_; 73 };74};75 76777879class Solution2 {80public:81 int maxPartitionFactor(vector<vector<int>>& points) {82 const auto& dist = [&](auto u, auto v) {83 return abs(points[u][0] - points[v][0]) + abs(points[u][1] - points[v][1]);84 };85 86 vector<tuple<int, int, int>> sorted_dists;87 for (int u = 0; u < size(points); ++u) {88 for (int v = u + 1; v < size(points); ++v) {89 sorted_dists.emplace_back(dist(u, v), u, v);90 }91 }92 sort(begin(sorted_dists), end(sorted_dists));93 vector<int> lookup(size(points), -1);94 UnionFind uf(size(points));95 for (const auto& [d, u, v] : sorted_dists) {96 if (uf.find_set(u) == uf.find_set(v)) {97 return d;98 }99 if (lookup[u] != -1) {100 uf.union_set(lookup[u], v);101 } else {102 lookup[u] = v;103 }104 if (lookup[v] != -1) {105 uf.union_set(lookup[v], u);106 } else {107 lookup[v] = u;108 }109 }110 return 0;111 }112 113private:114 class UnionFind {115 public:116 UnionFind(int n)117 : set_(n)118 , rank_(n) {119 iota(set_.begin(), set_.end(), 0);120 }121 122 int find_set(int x) {123 vector<int> stk;124 while (set_[x] != x) { 125 stk.emplace_back(x);126 x = set_[x];127 }128 while (!empty(stk)) {129 const int y = stk.back(); stk.pop_back();130 set_[y] = x;131 }132 return x;133 }134 135 bool union_set(int x, int y) {136 x = find_set(x), y = find_set(y);137 if (x == y) {138 return false;139 }140 if (rank_[x] > rank_[y]) {141 swap(x, y);142 }143 if (rank_[x] == rank_[y]) {144 ++rank_[y];145 }146 set_[x] = y; 147 return true;148 }149 150 private:151 vector<int> set_;152 vector<int> rank_;153 };154};155 156157158159class Solution3 {160public:161 int maxPartitionFactor(vector<vector<int>>& points) {162 static const int INF = numeric_limits<int>::max();163 164 const auto& binary_search_right = [](auto left, auto right, const auto& check) {165 while (left <= right) {166 const auto mid = left + (right - left) / 2;167 if (!check(mid)) {168 right = mid - 1;169 } else {170 left = mid + 1;171 }172 }173 return right;174 };175 176 const auto& dist = [&](auto u, auto v) {177 return abs(points[u][0] - points[v][0]) + abs(points[u][1] - points[v][1]);178 };179 180 const auto& is_bipartite = [&](auto d) {181 vector<int> lookup(size(points), -1);182 const auto& bfs = [&](auto u) {183 if (lookup[u] != -1) {184 return true;185 }186 lookup[u] = 0;187 vector<int> q = {u};188 while (!empty(q)) {189 vector<int> new_q;190 for (const auto& u : q) {191 for (int v = 0; v < size(points); ++v) {192 if (!(v != u && dist(v, u) < d)) {193 continue;194 }195 if (lookup[v] != -1) {196 if (lookup[v] != lookup[u] ^ 1) {197 return false;198 }199 continue;200 }201 lookup[v] = lookup[u] ^ 1;202 new_q.emplace_back(v);203 }204 }205 q = move(new_q);206 }207 return true;208 };209 210 for (int u = 0; u < size(points); ++u) {211 if (!bfs(u)) {212 return false;213 }214 }215 return true;216 };217 218 vector<int> sorted_dists;219 for (int u = 0; u < size(points); ++u) {220 for (int v = u + 1; v < size(points); ++v) {221 sorted_dists.emplace_back(dist(u, v));222 }223 }224 sorted_dists.emplace_back(INF);225 sort(begin(sorted_dists), end(sorted_dists));226 auto it = unique(begin(sorted_dists), end(sorted_dists));227 sorted_dists.erase(it, end(sorted_dists));228 int left = 0, right = size(sorted_dists) - 1;229 const auto& result = binary_search_right(left, right, [&](auto i) { return is_bipartite(sorted_dists[i]); });230 return sorted_dists[result] != INF ? sorted_dists[result] : 0;231 }232};233 234235236237class Solution4 {238public:239 int maxPartitionFactor(vector<vector<int>>& points) {240 const auto& binary_search_right = [](auto left, auto right, const auto& check) {241 while (left <= right) {242 const auto mid = left + (right - left) / 2;243 if (!check(mid)) {244 right = mid - 1;245 } else {246 left = mid + 1;247 }248 }249 return right;250 };251 252 const auto& dist = [&](auto u, auto v) {253 return abs(points[u][0] - points[v][0]) + abs(points[u][1] - points[v][1]);254 };255 256 const auto& is_bipartite = [&](auto d) {257 vector<int> lookup(size(points), -1);258 const auto& bfs = [&](auto u) {259 if (lookup[u] != -1) {260 return true;261 }262 lookup[u] = 0;263 vector<int> q = {u};264 while (!empty(q)) {265 vector<int> new_q;266 for (const auto& u : q) {267 for (int v = 0; v < size(points); ++v) {268 if (!(v != u && dist(v, u) < d)) {269 continue;270 }271 if (lookup[v] != -1) {272 if (lookup[v] != lookup[u] ^ 1) {273 return false;274 }275 continue;276 }277 lookup[v] = lookup[u] ^ 1;278 new_q.emplace_back(v);279 }280 }281 q = move(new_q);282 }283 return true;284 };285 286 for (int u = 0; u < size(points); ++u) {287 if (!bfs(u)) {288 return false;289 }290 }291 return true;292 };293 294 int mx = 0;295 for (int u = 0; u < size(points); ++u) {296 for (int v = u + 1; v < size(points); ++v) {297 mx = max(mx, dist(u, v));298 }299 }300 int left = 0, right = mx + 1;301 const auto& result = binary_search_right(left, right, is_bipartite);302 return result != mx + 1 ? result : 0;303 }304};305