题目链接

给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 二分+重复覆盖的更多相关文章

  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. android通讯录导航栏源码(一)

    通讯录导航栏源码: 1.activity package com.anna.contact.activity; import java.util.ArrayList; import java.util ...

  2. sed使用详解

    sed :Stream EDitor(流编辑器) sed :模式空间(默认不编辑源文件,仅对模式空间中数据做处理) sed [options] 'AddressCommand' file ... -n ...

  3. python基础:列表生成式和生成器

    列表生成式(List Comprehension) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成 list ...

  4. 删除数组中等于某个key的所有元素

    题目描述: 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 这道题目做暴力的想法就是,用一个指针从头到尾遍历,删除哪个元素就把后面的元素统一向前移动一个位置.但是这样的时间复杂度很 ...

  5. discuz二次开发笔记(二)------跳转函数运用

    前几天在增加修改功能时,突然用到一个提示函数,有点不理解,看了他的由来后果断做下笔记,感觉这在以后的开发中肯定还是要用的上的.有些地方不是很理解,在以后慢慢纠正.查补. Htm页面中用的js跳转: $ ...

  6. 开发移动端web应用, 使用手机自带键盘的搜索按钮

    很多时候在移动端的web页面中, 需要使用搜索功能, 然而页面中并没有太多的空间来放置一个像pc端上那样的搜索按钮, 这时候就需要借用手机输入法自带的搜索按钮来实现点击搜索 虽然不是什么大的功能, 但 ...

  7. Spring随笔 - 事务隔离级别

    Spring提供5中事务隔离级别: ISOLATION_DEFAULT:使用数据库后端的默认隔离级别. ISOLATION_READ_UNCOMMITTED:允许读取尚未提交的数据变更.可能会导致脏读 ...

  8. Android 大神博客汇集

    非常给力的CSDNBlog和个人Blog,这些Blog都有一个共同的特点,即内容详实,讲解透彻,也算是给后来的初学者指一条路吧!只要你下定决心跟随强者的脚步,成为人们眼中的大神,只不过是时间问题! 下 ...

  9. getActionBar()空指针异常

    网上的各种解决方案已经不少了,但是不适合于我的,谷歌一种新的解决方案 you can directly specify it in manifest file 1 2 3 4 <applicat ...

  10. python-md5加密

    python实现:md5_hash.py #-*- coding: UTF-8 -*- ' __date__ = '2016/4/11' from Tkinter import * import ha ...