hdu 5046 Airport 二分+重复覆盖
给n个点, 定义两点之间距离为|x1-x2|+|y1-y2|。 然后要选出k个城市建机场, 每个机场可以覆盖一个半径的距离。 求在选出点数不大于k的情况下, 这个半径距离的最大值。
二分半径, 然后距离小于等于半径的就连边, 然后跑重复覆盖。
- #include<bits/stdc++.h>
- using namespace std;
- #define pb(x) push_back(x)
- #define ll long long
- #define mk(x, y) make_pair(x, y)
- #define lson l, m, rt<<1
- #define mem(a) memset(a, 0, sizeof(a))
- #define rson m+1, r, rt<<1|1
- #define mem1(a) memset(a, -1, sizeof(a))
- #define mem2(a) memset(a, 0x3f, sizeof(a))
- #define rep(i, a, n) for(int i = a; i<n; i++)
- #define ull unsigned long long
- typedef pair<int, int> pll;
- const double PI = acos(-1.0);
- const double eps = 1e-;
- const int mod = 1e9+;
- const int inf = ;
- const int dir[][] = { {-, }, {, }, {, -}, {, } };
- const int maxn = ;
- const int maxNode = ;
- int num;
- struct DLX {
- int L[maxNode], R[maxNode], U[maxNode], D[maxNode], row[maxNode], col[maxNode];
- int S[maxn], H[maxn], sz, n, m, k, x[maxn], y[maxn];
- ll dis[maxn][maxn];
- void remove(int c) {
- for(int i = D[c]; i!=c; i = D[i]) {
- L[R[i]] = L[i];
- R[L[i]] = R[i];
- }
- }
- void resume(int c) {
- for(int i = U[c]; i!=c; i = U[i]) {
- L[R[i]] = i;
- R[L[i]] = i;
- }
- }
- int h() {
- int cnt = ;
- int vis[];
- mem(vis);
- for(int i = R[]; i!=; i = R[i]) {
- if(!vis[i]) {
- cnt++;
- vis[i] = ;
- for(int j = D[i]; j!=i; j = D[j]) {
- for(int k = R[j]; k!=j; k = R[k]) {
- vis[col[k]] = ;
- }
- }
- }
- }
- return cnt;
- }
- int dfs(int d) {
- if(d+h()>k)
- return ;
- if(R[] == ) {
- return ;
- }
- int c = R[];
- for(int i = R[]; i!=; i = R[i])
- if(S[c]>S[i])
- c = i;
- for(int i = D[c]; i!=c; i = D[i]) {
- remove(i);
- for(int j = R[i]; j!=i; j = R[j])
- remove(j);
- if(dfs(d+))
- return ;
- for(int j = L[i]; j!=i; j = L[j])
- resume(j);
- resume(i);
- }
- return ;
- }
- void add(int r, int c) {
- sz++;
- row[sz] = r;
- col[sz] = c;
- S[c]++;
- U[sz] = U[c];
- D[sz] = c;
- D[U[c]] = sz;
- U[c] = sz;
- if(~H[r]) {
- R[sz] = H[r];
- L[sz] = L[H[r]];
- L[R[sz]] = sz;
- R[L[sz]] = sz;
- } else {
- H[r] = L[sz] = R[sz] = sz;
- }
- }
- void init() {
- mem1(H);
- for(int i = ; i<=n; i++) {
- R[i] = i+;
- L[i] = i-;
- U[i] = i;
- D[i] = i;
- }
- mem(S);
- R[n] = ;
- L[] = n;
- sz = n;
- }
- int check(ll x) {
- init();
- for(int i = ; i <= n; i++) {
- for(int j = ; j <= n; j++) {
- if(dis[i][j] <= x) {
- add(i, j);
- }
- }
- }
- if(dfs())
- return ;
- return ;
- }
- void solve() {
- scanf("%d%d", &n, &k);
- for(int i = ; i <= n; i++) {
- scanf("%d%d", &x[i], &y[i]);
- }
- for(int i = ; i <= n; i++) {
- for(int j = ; j <= n; j++) {
- dis[i][j] = 1LL*abs(x[i]-x[j])+abs(y[i]-y[j]);
- }
- }
- ll l = , r = 4e9+, ans;
- for(int i = ; i < ; i++) {
- ll mid = l+r>>1LL;
- if(check(mid)) {
- ans = mid;
- r = mid-;
- } else {
- l = mid+;
- }
- }
- printf("%lld\n", ans);
- }
- }dlx;
- int main()
- {
- int t;
- cin>>t;
- for(int i = ; i<=t; i++) {
- printf("Case #%d: ", i);
- dlx.solve();
- }
- return ;
- }
hdu 5046 Airport 二分+重复覆盖的更多相关文章
- HDU 5046 Airport(DLX反复覆盖)
HDU 5046 Airport 题目链接 题意:给定一些机场.要求选出K个机场,使得其它机场到其它机场的最大值最小 思路:二分+DLX反复覆盖去推断就可以 代码: #include <cstd ...
- HDU 5046 Airport【DLX重复覆盖】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意: 给定n个城市的坐标,要在城市中建k个飞机场,使城市距离最近的飞机场的最长距离最小,求这 ...
- HDU 2295 Radar (重复覆盖)
Radar Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 2295.Radar (DLX重复覆盖)
2分答案+DLX判断可行 不使用的估计函数的可重复覆盖的搜索树将十分庞大 #include <iostream> #include <cstring> #include < ...
- (中等) 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 ...
- HDU 5046 Airport ( Dancing Links 反复覆盖 )
今年上海网络赛的一道题目 , 跟 HDU 2295 如出一辙 . 就是距离的计算一个是欧几里得距离 , 一个是曼哈顿距离 学完DLX感觉这题好水 ,就是一个裸的反复覆盖 注意下别溢出即可了 #incl ...
- HDU 5046 Airport(dlx)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:n个城市修建m个机场,使得每个城市到最近进场的最大值最小. 思路:二分+dlx搜索判定. ...
- HDU5046 Airport dancing links 重复覆盖+二分
这一道题和HDU2295是一样 是一个dancing links重复覆盖解决最小支配集的问题 在给定长度下求一个最小支配集,只要小于k就行 然后就是二分答案,每次求最小支配集 只不过HDU2295是浮 ...
- HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )
以下转自 这里 : 最小支配集问题:二分枚举最小距离,判断可行性.可行性即重复覆盖模型,DLX解之. A*的启发函数: 对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans ...
随机推荐
- json输出用法+jquery validate
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...
- 使用 Struts 2 实现国际化
struts2国际化(I18N) 国际化也叫I18N,是Internationalization的简称.Struts2国际化是建立在Java国际化基础上,只是Struts2框架对Java国际化进行了进 ...
- 转载 Jquery中AJAX参数详细介绍
Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址. type String (默认: "GET") 请求方式 ...
- DOM的认识以及一些节点的应用
HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. HTML DOM 树 通过 ...
- COMET技术具体实现 结合PHP和JQUERY
具体看代码,费话不说 PHP服务端 $mem = new RTMEM(); if(!$mem->conn()) exit('no mem server'); if(!$mem->getst ...
- jchat:linux聊天程序1:简介
做一个linux的聊天软件,虽然没什么创意,但是它可以用来锻炼和测试我对网络编程的掌握程度,也借此机会做一些有意思的程序. 这里做的是linux下一个命令行的客户端与服务器的聊天程序,没写界面,因为对 ...
- Datagridview控件实现分页功能
可以进行sql语句进行设置: 1.先新建一个窗体,一个DataGridView控件.两个label控件.两个Button控件 2.代码如下: using System; using Sy ...
- 算法分析-堆排序 HeapSort 优先级队列
堆排序的是集合了插入排序的单数组操作,又有归并排序的时间复杂度,完美的结合了2者的优点. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆. 情形1:ki < ...
- AU3学习笔记
目录 1. AU3是什么?能做什么? 2. 乱学AU3中的命令(语言相关)? 3. 通过简单示例学习AU3? 4. 正则表达式的学习(对大小写敏感) 5.对于GUI的相关学习 1. AU ...
- Spring中自己主动装配
自己主动装配 在我们了解过constructor-arg和property装配中.都须要配置对应的属性和值或者引用,假设在比較复杂的项目中.就会使得XML的配置变得复杂,自己主动装配能够使用较少的配置 ...