题目链接

给n个点, 定义两点之间距离为|x1-x2|+|y1-y2|。 然后要选出k个城市建机场, 每个机场可以覆盖一个半径的距离。 求在选出点数不大于k的情况下, 这个半径距离的最大值。

二分半径, 然后距离小于等于半径的就连边, 然后跑重复覆盖。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb(x) push_back(x)
  4. #define ll long long
  5. #define mk(x, y) make_pair(x, y)
  6. #define lson l, m, rt<<1
  7. #define mem(a) memset(a, 0, sizeof(a))
  8. #define rson m+1, r, rt<<1|1
  9. #define mem1(a) memset(a, -1, sizeof(a))
  10. #define mem2(a) memset(a, 0x3f, sizeof(a))
  11. #define rep(i, a, n) for(int i = a; i<n; i++)
  12. #define ull unsigned long long
  13. typedef pair<int, int> pll;
  14. const double PI = acos(-1.0);
  15. const double eps = 1e-;
  16. const int mod = 1e9+;
  17. const int inf = ;
  18. const int dir[][] = { {-, }, {, }, {, -}, {, } };
  19. const int maxn = ;
  20. const int maxNode = ;
  21. int num;
  22. struct DLX {
  23. int L[maxNode], R[maxNode], U[maxNode], D[maxNode], row[maxNode], col[maxNode];
  24. int S[maxn], H[maxn], sz, n, m, k, x[maxn], y[maxn];
  25. ll dis[maxn][maxn];
  26. void remove(int c) {
  27. for(int i = D[c]; i!=c; i = D[i]) {
  28. L[R[i]] = L[i];
  29. R[L[i]] = R[i];
  30. }
  31. }
  32. void resume(int c) {
  33. for(int i = U[c]; i!=c; i = U[i]) {
  34. L[R[i]] = i;
  35. R[L[i]] = i;
  36. }
  37. }
  38. int h() {
  39. int cnt = ;
  40. int vis[];
  41. mem(vis);
  42. for(int i = R[]; i!=; i = R[i]) {
  43. if(!vis[i]) {
  44. cnt++;
  45. vis[i] = ;
  46. for(int j = D[i]; j!=i; j = D[j]) {
  47. for(int k = R[j]; k!=j; k = R[k]) {
  48. vis[col[k]] = ;
  49. }
  50. }
  51. }
  52. }
  53. return cnt;
  54. }
  55. int dfs(int d) {
  56. if(d+h()>k)
  57. return ;
  58. if(R[] == ) {
  59. return ;
  60. }
  61. int c = R[];
  62. for(int i = R[]; i!=; i = R[i])
  63. if(S[c]>S[i])
  64. c = i;
  65. for(int i = D[c]; i!=c; i = D[i]) {
  66. remove(i);
  67. for(int j = R[i]; j!=i; j = R[j])
  68. remove(j);
  69. if(dfs(d+))
  70. return ;
  71. for(int j = L[i]; j!=i; j = L[j])
  72. resume(j);
  73. resume(i);
  74. }
  75. return ;
  76. }
  77. void add(int r, int c) {
  78. sz++;
  79. row[sz] = r;
  80. col[sz] = c;
  81. S[c]++;
  82. U[sz] = U[c];
  83. D[sz] = c;
  84. D[U[c]] = sz;
  85. U[c] = sz;
  86. if(~H[r]) {
  87. R[sz] = H[r];
  88. L[sz] = L[H[r]];
  89. L[R[sz]] = sz;
  90. R[L[sz]] = sz;
  91. } else {
  92. H[r] = L[sz] = R[sz] = sz;
  93. }
  94. }
  95. void init() {
  96. mem1(H);
  97. for(int i = ; i<=n; i++) {
  98. R[i] = i+;
  99. L[i] = i-;
  100. U[i] = i;
  101. D[i] = i;
  102. }
  103. mem(S);
  104. R[n] = ;
  105. L[] = n;
  106. sz = n;
  107. }
  108. int check(ll x) {
  109. init();
  110. for(int i = ; i <= n; i++) {
  111. for(int j = ; j <= n; j++) {
  112. if(dis[i][j] <= x) {
  113. add(i, j);
  114. }
  115. }
  116. }
  117. if(dfs())
  118. return ;
  119. return ;
  120. }
  121. void solve() {
  122. scanf("%d%d", &n, &k);
  123. for(int i = ; i <= n; i++) {
  124. scanf("%d%d", &x[i], &y[i]);
  125. }
  126. for(int i = ; i <= n; i++) {
  127. for(int j = ; j <= n; j++) {
  128. dis[i][j] = 1LL*abs(x[i]-x[j])+abs(y[i]-y[j]);
  129. }
  130. }
  131. ll l = , r = 4e9+, ans;
  132. for(int i = ; i < ; i++) {
  133. ll mid = l+r>>1LL;
  134. if(check(mid)) {
  135. ans = mid;
  136. r = mid-;
  137. } else {
  138. l = mid+;
  139. }
  140. }
  141. printf("%lld\n", ans);
  142. }
  143. }dlx;
  144. int main()
  145. {
  146. int t;
  147. cin>>t;
  148. for(int i = ; i<=t; i++) {
  149. printf("Case #%d: ", i);
  150. dlx.solve();
  151. }
  152. return ;
  153. }

hdu 5046 Airport 二分+重复覆盖的更多相关文章

  1. HDU 5046 Airport(DLX反复覆盖)

    HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...

  2. HDU 5046 Airport【DLX重复覆盖】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意: 给定n个城市的坐标,要在城市中建k个飞机场,使城市距离最近的飞机场的最长距离最小,求这 ...

  3. HDU 2295 Radar (重复覆盖)

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. HDU 2295.Radar (DLX重复覆盖)

    2分答案+DLX判断可行 不使用的估计函数的可重复覆盖的搜索树将十分庞大 #include <iostream> #include <cstring> #include < ...

  5. (中等) HDU 5046 Airport ,DLX+可重复覆盖+二分。

    Description The country of jiuye composed by N cites. Each city can be viewed as a point in a two- d ...

  6. HDU 5046 Airport ( Dancing Links 反复覆盖 )

    今年上海网络赛的一道题目 , 跟 HDU 2295 如出一辙 . 就是距离的计算一个是欧几里得距离 , 一个是曼哈顿距离 学完DLX感觉这题好水 ,就是一个裸的反复覆盖 注意下别溢出即可了 #incl ...

  7. HDU 5046 Airport(dlx)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小. 思路:二分+dlx搜索判定. ...

  8. HDU5046 Airport dancing links 重复覆盖+二分

    这一道题和HDU2295是一样 是一个dancing links重复覆盖解决最小支配集的问题 在给定长度下求一个最小支配集,只要小于k就行 然后就是二分答案,每次求最小支配集 只不过HDU2295是浮 ...

  9. HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )

    以下转自 这里 : 最小支配集问题:二分枚举最小距离,判断可行性.可行性即重复覆盖模型,DLX解之. A*的启发函数: 对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans ...

随机推荐

  1. json输出用法+jquery validate

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  2. 使用 Struts 2 实现国际化

    struts2国际化(I18N) 国际化也叫I18N,是Internationalization的简称.Struts2国际化是建立在Java国际化基础上,只是Struts2框架对Java国际化进行了进 ...

  3. 转载 Jquery中AJAX参数详细介绍

    Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ...

  4. DOM的认识以及一些节点的应用

    HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. HTML DOM 树 通过 ...

  5. COMET技术具体实现 结合PHP和JQUERY

    具体看代码,费话不说 PHP服务端 $mem = new RTMEM(); if(!$mem->conn()) exit('no mem server'); if(!$mem->getst ...

  6. jchat:linux聊天程序1:简介

    做一个linux的聊天软件,虽然没什么创意,但是它可以用来锻炼和测试我对网络编程的掌握程度,也借此机会做一些有意思的程序. 这里做的是linux下一个命令行的客户端与服务器的聊天程序,没写界面,因为对 ...

  7. Datagridview控件实现分页功能

    可以进行sql语句进行设置:      1.先新建一个窗体,一个DataGridView控件.两个label控件.两个Button控件   2.代码如下: using System; using Sy ...

  8. 算法分析-堆排序 HeapSort 优先级队列

    堆排序的是集合了插入排序的单数组操作,又有归并排序的时间复杂度,完美的结合了2者的优点. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆. 情形1:ki < ...

  9. AU3学习笔记

    目录 1. AU3是什么?能做什么? 2. 乱学AU3中的命令(语言相关)? 3. 通过简单示例学习AU3? 4. 正则表达式的学习(对大小写敏感) 5.对于GUI的相关学习 1.        AU ...

  10. Spring中自己主动装配

    自己主动装配 在我们了解过constructor-arg和property装配中.都须要配置对应的属性和值或者引用,假设在比較复杂的项目中.就会使得XML的配置变得复杂,自己主动装配能够使用较少的配置 ...