hdu5064 DLX可重复覆盖+二分
这题题意是 给了n个城市 在其中小于等于k个城市建立机场然后 使得最远的那个离机场的城市距离最短
二分答案 ,我们对于每次的mid 重新建图然后再来一次DLX,每个点可以覆盖的点建立一条联系就ok了
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
const int maxn=;
const int maxnode=*;
int K;
struct DLX
{
int numCol,numRow,U[maxnode],D[maxnode],L[maxnode],R[maxnode],row[maxnode],col[maxnode];
int S[maxn],H[maxn],siz;
void init(int n,int m)
{
this->numCol=n; this->numRow=m;
for(int i=; i<=numCol; i++)
{
S[i]=;
U[i]=D[i]=i;
L[i]=i-; R[i]=i+;
}
L[]=n; R[n]=;
for(int i=; i<=numRow; i++)H[i]=-;
siz=n+;
}
void link(int r, int c)
{
S[c]++;
row[siz]=r;
col[siz]=c;
U[siz]=U[c];
D[siz]=c;
D[U[siz]]=siz;
U[D[siz]]=siz;
if(H[r]==-){
H[r]=L[siz]=R[siz]=siz;
}else {
L[siz]=H[r];
R[siz]=R[H[r]];
R[L[siz]]=siz;
L[R[siz]]=siz;
H[r]=siz;
}
siz++;
}
bool v[maxnode];
int AX()
{
for(int c=R[]; c!=; c=R[c])v[c]=true;
int ret=;
for(int c=R[]; c!=; c=R[c])
if(v[c])
{
ret++;
v[c]=false;
for(int i=D[c];i!=c; i=D[i])
for(int j=R[i]; j!=i; j=R[j])
v[col[j]]=false;
}
return ret;
}
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]]=R[L[i]]=i;
}
bool Dance(int d)
{
if(AX()+d>K)return false;
if(R[]==)return d<=K;
int c=R[];
for(int i=R[]; i!=; i=R[i])
if(S[i]<S[c])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(Dance(d+))return true;
for(int j=L[ i ]; j!=i; j=L[ j ])resume( j );
resume( i );
}
return false;
} }g;
struct point
{
int x,y;
void input()
{
scanf("%d%d",&x,&y);
}
}city[maxn];
long long dis(point a, point b)
{
return (long long)abs(a.x-b.x)+(long long)abs(a.y-b.y);
}
int main()
{
int cas;
scanf("%d",&cas);
for(int cc=; cc<=cas; cc++)
{
int n;
scanf("%d%d",&n,&K);
for(int i=; i<n; i++)
city[i].input();
long long L=,R=100000000000LL;
long long ans=;
while(L<=R)
{
long long mid=(L+R)>>;
g.init(n,n);
for(int i=;i<n;i++)
for(int j=; j<n;j++)
if(dis(city[i],city[j])<=mid)
g.link(i+,j+);
if(g.Dance()){R=mid-;ans=mid; }
else L=mid+;
}
printf("Case #%d: %I64d\n",cc,ans);
}
return ;
}
hdu5064 DLX可重复覆盖+二分的更多相关文章
- (中等) 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 2295 dlx重复覆盖+二分答案
题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...
- (中等) POJ 1084 Square Destroyer , DLX+可重复覆盖。
Description The left figure below shows a complete 3*3 grid made with 2*(3*4) (=24) matchsticks. The ...
- (简单) FZU 1686 神龙的难题 , DLX+可重复覆盖。
Description 这是个剑与魔法的世界.英雄和魔物同在,动荡和安定并存.但总的来说,库尔特王国是个安宁的国家,人民安居乐业,魔物也比较少.但是.总有一些魔物不时会进入城市附近,干扰人民的生活.就 ...
- UVA - 1603 Square Destroyer (DLX可重复覆盖+IDA*)
题目链接 给你一个n*n的由火柴组成的正方形网格,从中预先拿掉一些火柴,问至少还需要拿掉多少火柴才能破坏掉所有的正方形. 看到这道题,我第一反应就是——把每根火柴和它能破坏掉的正方形连边,不就是个裸的 ...
- hdu3656Fire station(DLX重复覆盖 + 二分)
题目请戳这里 题目大意:一个城市n个点,现在要建m个消防站,消防站建在给定的n个点中.求建m个消防站后,m个消防站要覆盖所有的n个点的覆盖半径最小. 题目分析:重复覆盖问题,DLX解决.不过要求覆盖半 ...
- hdu5046(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意:要在n个城市里建造不超过k个机场覆盖所有城市,问机场城市之间最大距离最小为多少. 分析:二 ...
- hdu2295(重复覆盖+二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2295 题意::一个国家有n个城市,有m个地方可以建造雷达,最多可以建K个雷达(K>=1 & ...
- HDU 3957 Street Fighter(搜索、DLX、重复覆盖+精确覆盖)
很久以前就看到的一个经典题,一直没做,今天拿来练手.街霸 给n<=25个角色,每个角色有 1 or 2 个版本(可以理解为普通版以及爆发版),每个角色版本可以KO掉若干人. 问最少选多少个角色( ...
随机推荐
- 树和二叉树->其他(待完善)
关于树和二叉树的部分,还有如下三个知识点,待以后时间更充裕的时候再回头完善. 1 树与等价问题 文字描述 关于等价关系和等价类的定义,在离散数学上的描述有点拗口, 其实在数据结构中,这部分相关的主要是 ...
- 内部排序->插入排序->其它插入排序->折半插入排序
文字描述 和直接插入排序比较,只是把“查找”操作利用“折半查找”来实现,由此进行的插入排序叫做折半插入排序. 示意图 略 算法分析 和直接插入排序比,减少了比较次数,但是移动次数没有变,所以折半插入排 ...
- 2018/09/05《涂抹MySQL》【权限管理】学习笔记(二)
读 第四章<管理MySQL库与表> 第五章<MySQL的权限管理> 总结 1:当配置好 MySQL 数据库后,发现有几个默认的库,他们的意义和作用?(这里只做简单了解,之后用到 ...
- Maven基本介绍及安装
什么是Maven 是一个跨平台的项目管理工具. 跨平台是指它几乎可以在现有所有流行的操作系统中运行 maven不仅可以构建项目,还可以依赖管理和项目信息管理 Maven解决了什么问题 maven解决了 ...
- openssh源码分析笔记
1.客户端保活: options.client_alive_interval options.client_alive_count_max 在wait_until_can_do_something() ...
- Magento 2数据库EAV模型结构
EAV模型是一种数据模型 ,用于描述实体的数量预计会很大,但事实上,实体中要使用的属性数量并不多. Magento 2这么设计是为了灵活性,在不影响主干的基础上,任意新增删除属性. EAV模型(E ...
- git bash字体设置
Git工具安装完毕之后,快速启动栏目显示有Git Bash.Git CMD和Git GUI.其中,Git Bash是跟Linux命令一样的,输入命令形式的.但是,有时输入命令显示的字体太小,需要对其进 ...
- [路径规划] VFF和VFH
VFF虚拟力场法 #ifndef VFF_HEADER #define VFF_HEADER #include <vector> #include "utils\point.h& ...
- python的map函数
map:对指定序列做映射 python3中的: map(function, iterable, ...) map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, ...
- pycharm的安装和使用
python开发IDE: pycharm.eclipse 1.要专业版 2.不要汉化版 一.运算符 + - * ./ ** % // 判断某个东西是否在东西里面包含 in not ...