题意:

N个点。再点上建M个消防站。

问消防站到每一个点的最大距离的最小是多少。

思路:

DLX直接二分推断TLE了。

这时候一个非常巧妙的思路

我们求的距离一定是两个点之间的距离

因此我们把距离都求一遍排序一下。

然后用下标二分  这样就AC了。

代码:

#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"iostream"
#include"cmath"
#include"queue"
#include"map"
#include"vector"
#include"string"
using namespace std;
#define eps 1e-6
#define N 55*55
#define RN 55
#define CN 55
double dist[N];
int kx;
struct DLX
{
int n,m,C;
int U[N],D[N],L[N],R[N],Row[N],Col[N];
int H[RN],S[CN],cnt,ans[RN];
void init(int _n,int _m)
{
n=_n;
m=_m;
for(int i=0; i<=m; i++)
{
S[i]=0;
U[i]=D[i]=i;
L[i]=(i==0?m:i-1);
R[i]=(i==m? 0:i+1);
}
C=m;
for(int i=1; i<=n; i++) H[i]=-1;
}
void link(int x,int y)
{
C++;
Row[C]=x;
Col[C]=y;
S[y]++;
U[C]=U[y];
D[C]=y;
D[U[y]]=C;
U[y]=C;
if(H[x]==-1) H[x]=L[C]=R[C]=C;
else
{
L[C]=L[H[x]];
R[C]=H[x];
R[L[H[x]]]=C;
L[H[x]]=C;
}
}
void del(int x)
{
for(int i=D[x]; i!=x; i=D[i])
{
R[L[i]]=R[i];
L[R[i]]=L[i];
}
}
void rec(int x)
{
for(int i=U[x]; i!=x; i=U[i])
{
R[L[i]]=i;
L[R[i]]=i;
}
}
int used[CN];
int h()
{
int sum=0;
for(int i=R[0]; i!=0; i=R[i]) used[i]=0;
for(int i=R[0]; i!=0; i=R[i])
{
if(used[i]==0)
{
sum++;
used[i]=1;
for(int j=D[i]; j!=i; j=D[j]) for(int k=R[j]; k!=j; k=R[k]) used[Col[k]]=1;
}
}
return sum;
}
int dance(int x)
{
if(x+h()>=cnt || x+h()>kx) return 0;
if(R[0]==0)
{
cnt=min(cnt,x);
if(cnt<=kx) return 1;
return 0;
}
int now=R[0];
for(int i=R[0]; i!=0; i=R[i])
{
if(S[i]<S[now])
now=i;
}
for(int i=D[now]; i!=now; i=D[i])
{
del(i);
for(int j=R[i]; j!=i; j=R[j]) del(j);
if (dance(x+1)) return 1;
for(int j=L[i]; j!=i; j=L[j]) rec(j);
rec(i);
}
return 0;
}
} dlx;
struct node
{
double x,y;
} dian[55];
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d%d",&n,&kx);
for(int i=1;i<=n;i++) scanf("%lf%lf",&dian[i].x,&dian[i].y);
int cnt=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
dist[cnt++]=dis(dian[i].x,dian[i].y,dian[j].x,dian[j].y);
}
}
sort(dist,dist+cnt);
int l=0,r=cnt-1;
double ans;
while(l<=r)
{
int mid=(l+r)/2;
dlx.init(n,n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
double tep=dis(dian[i].x,dian[i].y,dian[j].x,dian[j].y);
if(tep>dist[mid]) continue;
dlx.link(i,j);
}
}
dlx.cnt=999;
if(dlx.dance(0))
{
ans=dist[mid];
r=mid-1;
}
else l=mid+1;
}
printf("%.6f\n",ans); }
return 0;
}

[DLX反复覆盖] hdu 3656 Fire station的更多相关文章

  1. [DLX反复覆盖] hdu 2828 Lamp

    题意: 有N个灯M个开关 每一个灯的ON和OFF状态都能控制一个灯是否亮 给出N行,代表对于每一个灯 哪些开关的哪个状态能够使得第i个灯亮 思路: 这里须要注意一个问题 假设开关1的ON 状态和开关2 ...

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

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

  3. FZU 1686 神龙的难题(DLX反复覆盖)

    FZU 1686 神龙的难题 pid=1686" target="_blank" style="">题目链接 题意:中文题 思路:每个1看成列, ...

  4. FZU 1686 神龙的难题 DLX反复覆盖

    DLX反复覆盖: 须要一个A*函数剪支 Problem 1686 神龙的难题 Accept: 462    Submit: 1401 Time Limit: 1000 mSec    Memory L ...

  5. HDOJ 2828 Lamp DLX反复覆盖

    DLX反复覆盖模版题: 每一个开关两个状态.但仅仅能选一个,建2m×n的矩阵跑DLX模版.. .. Lamp Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  6. HDU 4735 Little Wish~ lyrical step~(DLX , 反复覆盖)

    解题思路: DLX 的模板题.反复覆盖. #include <stdio.h> #include <string.h> #include <iostream> #i ...

  7. [DLX精确覆盖] hdu 1603 A Puzzling Problem

    题意: 给你n块碎片,这些碎片不能旋转.翻折. 问你能不能用当中的某些块拼出4*4的正方形. 思路: 精确覆盖裸题了 建图就是看看每一个碎片在4*4中能放哪些位置,这个就作为行. 列就是4*4=16个 ...

  8. [DLX精确覆盖] hdu 3663 Power Stations

    题意: 给你n.m.d,代表有n个城市.m条城市之间的关系,每一个城市要在日后d天内都有电. 对于每一个城市,都有一个发电站,每一个发电站能够在[a,b]的每一个连续子区间内发电. x城市发电了.他相 ...

  9. [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)

    Problem 1686 神龙的难题 Accept: 444    Submit: 1365 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Pro ...

随机推荐

  1. lucene查询索引之QueryParser解析查询——(八)

    0.语法介绍:

  2. springMVC初次搭建,产生错误

    七月 11, 2016 11:12:58 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version: Ap ...

  3. zabbix3.0配置服务器流量告警

    zabbix配置流量告警 zabbix虽然已经对服务器的网卡流量进行了监控,但为了防止某台机器流量过高导致网络慢,或者因为中病毒或木马等原因,导致流量很高,可使用zabbix的流量告警功能来对流量进行 ...

  4. 六、vue路由Vue Router

    一.基本概念 route, routes, router 1, route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容, 这是一条route,  a ...

  5. window批处理——bat文件的编写

    BAT 批处理脚本 教程   第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命 ...

  6. javaweb笔记六

    指令包含:可以在一个jsp中包含另一个jsp中的内容.会将包含页面和被包含页面放在一起编译,形成一个java类.所以,是在编译时发生的.只能包含文件,不允许两个页面之间存在同名变量.被包含页面也不应该 ...

  7. 20165203 Mypwd的解读与实现

    20165203 Mypwd的解读与实现 pwd 含义:在Linux层次结构中,想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名. 语法:pwd [option] 描述:pwd 命令将当 ...

  8. **如何让CI框架支持service层

    http://www.bitscn.com/pdb/php/201411/404708.html 大家知道CodeIgniter框架式MVC分层的,通常大家把业务逻辑写到Controller中,而Mo ...

  9. winform解析json

    在使用C#开发爬虫程序时,会遇到需要解析json字符串的情况.对于json字符串可以使用正则表达式的形式进行解析,更为方便的方法是使用Newtonsoft.Json来实现. Nuget添加应用包 在工 ...

  10. C语言:逻辑推理

    1A.B.C.D.E五名学生有可能参加计算机竞赛,根据下列条件判断哪些(10分) 题目内容:   A.B.C.D.E五名学生有可能参加计算机竞赛,根据下列条件判断哪些 人参加了竞赛: (1)A参加时, ...