diff --git a/Codeforces/85/E/E.cpp b/Codeforces/85/E/E.cpp new file mode 100644 index 00000000..1555ee6f --- /dev/null +++ b/Codeforces/85/E/E.cpp @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 1e4 + 5; +const int mod = 1e9 + 7; + +int n, color[N], ans; +std::pair points[N]; + +int dis(int i, int j) { + return std::abs(points[i].first - points[j].first) + std::abs(points[i].second - points[j].second); +} + +bool dfs(int u, int c, int limit) { + color[u] = c; + + for (int v = 1; v <= n; v++) { + if (v == u || dis(u, v) <= limit) continue; + + if (color[v] == -1) { + if (!dfs(v, c ^ 1, limit)) return false; + } else if (color[v] == color[u]) { + return false; + } + } + + return true; +} + +bool check(int x) { + std::fill(std::begin(color), std::end(color), -1); + + int cnt = 0; + + for (int i = 1; i <= n; i++) { + if (color[i] == -1) { + cnt++; + if (!dfs(i, 1, x)) return false; + } + } + + ans = cnt; + + return true; +} + +int binpow(int a, int b) { + int res = 1; + + while (b) { + if (b & 1) res = static_cast(res) * a % mod; + a = static_cast(a) * a % mod; + b >>= 1; + } + + return res; +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + cin >> n; + + for (int i = 1; i <= n; i++) { + cin >> points[i].first >> points[i].second; + } + + int l = 0, + r = 10000, + res = 0; + + while (l <= r) { + int mid = (l + r) >> 1; + + if (check(mid)) { + res = mid; + r = mid - 1; + } else { + l = mid + 1; + } + } + + cout << res << endl + << binpow(2, ans) << endl; + + return 0; +}