HDU 4543|三足鼎立|曼哈顿距离|二分答案
2017-07-11 15:57
369 查看
三足鼎立
Time Limit: 3000/1000 MS (Java/Others)Memory Limit: 65535/32768 K (Java/Others)
Problem Description
“纷纷世事无穷尽,天数茫茫不可逃。鼎足三分已成梦,后人凭吊空牢骚。”三国的各种传奇故事被千百年传诵,为人们津津乐道。魏、蜀、吴三个势力相互制约,同时也相互利用,“三”的神奇和精妙尽在其中。于是,这个问题也是关于“三”的。
在一个N×M的地图上,两个点(x1, y1)和(x2, y2)之间的距离被定义成曼哈顿距离,魏、蜀、吴三个势力要在这个地图上分别选择自己的据点。由于地图上某些点已经被其他势力占据,为了避免不必要的冲突,他们希望自己的据点与其他被占据的点都可以保持一定的距离,包括他们三个势力据点的相互距离,也要满足约束。
现在,三个势力不可思议的开了一次首脑峰会,商谈据点的安排问题。你,作为一个像鲁肃大师一样爱好和平的外交家,要给出最大的限制距离,使得至少有一种安排方案满足条件。
Input
输入第一行为T,表示有T组测试数据。每组数据以两个整数N和M开始,表示地图的规模。接下来的N行,每一行包含一个长度为M的字符串,表示地图,‘.’表示空地,’F’表示这里已被其他势力占据。地图至少有三个空格以供选择。
[Technical Specification]
1. 1≤T≤74
2. 1≤N,M≤74
Output
对每组数据,先输出为第几组数据,然后输出最大限制距离。Sample Input
2 4 4 F... .... .... .... 4 4 F..F .... .... F..F
Sample Output
Case 1: 3 Case 2: 1
Hint
第一组样例中,他们可以约定依次选择 (1, 4), (4, 1), (4, 4) 作为据点,这样两两之间的距离都为3,到 (1, 1) 的最小距离也是3,是一种最优的选择。Solution
对于这种最大化XX的最小值的问题很容易联系到二分答案。接下来我们考虑如何判定答案是否合法。
1. 既然我们已知了各点间的最小距离,我们就可以处理出地图内哪些点是可以安排据点的。考虑到NM≤5500,我们可以猜测出一种可行的时间复杂度O((nm)2),这只允许我们枚举两个据点快速推出第三个据点,或者是枚举一个据点,通过扫一遍棋盘的方式找出后两个据点。
2. 我们再来考虑曼哈顿距离,曼哈顿距离的题目可以通过旋转棋盘45°的方式转化,即在原棋盘上的一个点(x,y),变换为新棋盘上的点(x+y,x-y),我们用(a,b)代替,那么原来两个点(x1,y1),(x2,y2)的距离|x1−x2|+|y1−y2|,就有
===(x1−x2)+|y1−y2|max{(x1−x2)+(y1−y2),(x1−x2)−(y1−y2)}max{(x1+y1−x2−y2),(x1−y1−x2+y2)}max{|a1−a2|,|b1−b2|}
结果只与一些点的横坐标或一些点的纵坐标有关,我们就可以分别最大化一些点的横坐标和一些点的纵坐标,最后求最大值即可。
最大化横或纵坐标可以通过扫一遍棋盘实现。
最终的复杂度为O((nm)2log(nm)),可以卡过。。。
当然也可以数据结构维护这些值,可以使复杂度少掉一个nm,但我还是不会。。。
#include <cstdio> #include <algorithm> typedef long long ll; const int inf = 0x7ffffff; using namespace std; #define FOR(i,j,k) for(i=j;i<=k;++i) const int N = 128; int n, m, dis ; char mp ; // compute manhattan distance between (x, y) and (i, j) inline int manhattan(int x, int y, int i, int j) { return abs(x - i) + abs(y - j); } // t - minimum manhattan distance bool judge(int t) { int i, j, k, l, x, y, xl, xr, yl, yr, cnt; FOR(i,1,n) FOR(j,1,m) if (dis[i][j] >= t) { cnt = 0; xl = yl = inf; xr = yr = -inf; FOR(k,1,n) FOR(l,1,m) if (dis[k][l] >= t && manhattan(k, l, i, j) >= t) { ++cnt; x = k + l; y = k - l; // in order to acquire maximum distance, we need to maximize xr, yr and minimuize xl, yl. xl = min(xl, x); xr = max(xr, x); yl = min(yl, y); yr = max(yr, y); } if (cnt > 1) if (max(xr - xl, yr - yl) >= t) return true; } return false; } int main() { int t, kase, i, j, x, y, l, r, mid, ans; scanf("%d", &t); FOR(kase,1,t) { scanf("%d%d", &n, &m); FOR(i,1,n) scanf("%s", mp[i] + 1); FOR(i,1,n) FOR(j,1,m) dis[i][j] = mp[i][j] == 'F' ? 0 : inf; // compute distances between F and . FOR(i,1,n) FOR(j,1,m) if (mp[i][j] == 'F') FOR(x,1,n) FOR(y,1,m) if (mp[x][y] == '.') dis[x][y] = min(dis[x][y], manhattan(i, j, x, y)); // binary search the answer for (l = 1, r = n + m, ans = 0; l < r; ) { mid = l + r >> 1; if (judge(mid)) ans = mid, l = mid + 1; else r = mid; } printf("Case %d: %d\n", kase, ans); } return 0; }
相关文章推荐
- hdu 4033 Regular Polygon (几何题 二分答案)
- hdu 3656 Fire station 重复覆盖 DLX+二分答案 给出一些城市及一些救火站的坐标,要求这些救火站覆盖所有的城市,问从救火站到城市的最长时间至少是多少。
- HDU-4666 Hyperspace 曼哈顿距离
- 最远曼哈顿距离小结 poj 2926 Requirements&hdu 4666 Hyperspace
- HDU 2333 & POJ 3497 & UVA 12124 Assemble (二分答案)
- hdu 2295 Radar (二分答案+重复覆盖)
- [HDU 4666]Hyperspace[最远曼哈顿距离][STL]
- HDU 4666 最远曼哈顿距离
- 2013 多校第七场 hdu 4666 Hyperspace(最远曼哈顿距离)
- hdu-4666-Hyperspace-最长曼哈顿距离
- HDU-4004 The Frog's Games 二分答案
- HDU 4311&2 Meeting point-1&2(曼哈顿距离&&切比雪夫距离)
- HDU-4311 Meeting point-1 曼哈顿距离快速计算
- hdu 4666 Hyperspace(多维度最远曼哈顿距离)
- HDU 4190 Distributing Ballot Boxes(二分答案)
- hdu 2295 Radar 重复覆盖 DLX+二分答案 给出一些城市及一些雷达的坐标,要求从这些雷达中选取最多k个能够覆盖所有的城市,问雷达的最小覆盖半径为多少
- hdu 4190 二分答案
- hdu 4543 —— 三足鼎立
- hdu 4666 (经典求曼哈顿距离 + multiset容器)
- HDU 3681 Prison Break (二分答案+状压DP+bfs预处理)