CF-85E.Guard Towers(二分+染色)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                CF-85E.Guard Towers(二分+染色)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                CF-85E.Guard Towers(二分+染色)
題目鏈接
題意
nnn個(gè)燈塔分成2分,求出最小的曼哈頓距離和其方案樹
題意
二分+染色
二分枚舉最小值midmidmid,判斷能否將nnn個(gè)燈塔分為最大曼哈頓值不超過(guò)midmidmid的兩份
方案數(shù)=2聯(lián)通塊個(gè)數(shù)2^{聯(lián)通塊個(gè)數(shù)}2聯(lián)通塊個(gè)數(shù)
#include <bits/stdc++.h> const int maxn = 5e3 + 5; const int mod = 1e9 + 7; using namespace std; pair<int,int> a[maxn]; int cnt, vis[maxn], n; long long Pow(long long a, long long b) {long long ans = 1;while (b) {if (b & 1) {ans *= a;ans %= mod;}a *= a;a %= mod;b >>= 1;}return ans; } int dfs(int u, int c, int mid) {for (int i = 0; i < n; ++i) {int len = abs(a[i].first - a[u].first) + abs(a[i].second - a[u].second);if (len <= mid || vis[i] == (c^1)) continue;if (vis[i] == c) return -1;vis[i] = c ^ 1;if (dfs(i, c^1, mid) == -1) return -1; }return 1; } int check(int mid) {fill(vis, vis+maxn, -1);cnt = 0;for (int i = 0; i < n; ++i) {if (vis[i] == -1) {cnt++;vis[i] = 0;if (dfs(i, 0, mid) == -1) return -1;} } } int main() {scanf("%d", &n);for (int i = 0; i < n; ++i) {scanf("%d %d", &a[i].first, &a[i].second);}int l = 0, r = 1e4;while (l <= r) {int mid = (l + r) >> 1;if (check(mid) == -1) l = mid + 1;else r = mid - 1; }check(l);printf("%d\n%lld\n", l, Pow(2, cnt));return 0; }總結(jié)
以上是生活随笔為你收集整理的CF-85E.Guard Towers(二分+染色)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: CF-1023F.Mobile Phon
 - 下一篇: CF-778 C.Peterson Po