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掉若干人. 问最少选多少个角色( ...
随机推荐
- # 20165225 《Java程序设计》第一周学习总结
20165225 <Java程序设计>第一周学习总结 1.视频与课本中的学习: 首先是为了运行和开发Java分别安装了JRE和JDK,具体做法在老师给的<Java2 实用教程(第五版 ...
- spring学习(02)之配置文件没有提示问题
配置文件没有提示问题 1 spring引入schema约束,把约束文件引入到eclipse中 (1)复制约束路径 http://www.springframework.org/schema/beans ...
- webmin账户重置密码
locate changepass.pl(如果你不常使用locate的话那,先sudo updatedb)找到路径,在/usr/libexec/webmin/下面,转到这个目录下面./changepa ...
- Python中使用SMTP发送邮件以及POP收取邮件
假设我们自己的电子邮件地址是from@163.com,对方的电子邮件地址是to@sina.com(这里的地址虚拟的),现在我们用Outlook或者Foxmail之类的软件写好邮件,填上对方的Email ...
- MySQL 多源复制(Mulit-Source Replication)
MySQL多源复制方案 看复制源Master_1的同步状态:SHOW SLAVE STATUS FOR CHANNEL 'Master_1'\G 查看复制源Master_2的同步状态:S ...
- 【CART与GBDT】
一.CART(分类回归树) 1.思想: 一种采用基尼信息增益作为划分属性的二叉决策树.基尼指数越小,表示纯度越高. 2.回归: 每个节点都有一个预测值,预测值等于属于该节点的所有样例的 ...
- poi 生成excel,最简单代码
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFSheet; i ...
- vue 刷新当前页面
情景: 比如在删除或者增加一条记录的时候希望当前页面可以重新刷新 请求接口中直接将数组结果取第0个数组或者第n个数组给变量,会报错 0 的错误,此时多次刷新即可 方法一.这种方法简单快捷,但是页面会有 ...
- nohup 详解
转:https://www.cnblogs.com/jinxiao-pu/p/9131057.html nohup nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所 ...
- 根据构建类型动态设置AndroidManifest.xml文件中的meta-data
当debug和release版本使用不同的值时,使用Gradle设置相应的值. Android主配置文件 <meta-data android:name="com.amap.api.v ...