题意:

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. py-faster-rcnn代码阅读3-roidb.py

    roidb是比较复杂的数据结构,存放了数据集的roi信息.原始的roidb来自数据集,在trian.py的get_training_roidb(imdb)函数进行了水平翻转扩充数量,然后prepare ...

  2. 【ARTS】01_02_左耳听风-20181119~1125

    Algorithm 做一个 leetcode 的算法题 Unique Email Addresses https://leetcode.com/problems/unique-email-addres ...

  3. PHP中冒号、endif、endwhile、endfor使用介绍

    我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: 复制代码代码如下: <?php if(empty($GET_['a'])): ?> <font c ...

  4. casperjs 知乎登陆

    phantom.casperTest = true; phantom.outputEncoding="utf-8"; var fs = require('fs'); var cas ...

  5. 发布构件到Maven中央仓库

    一.注册jira账号 访问如下网址: https://issues.sonatype.org/secure/Signup.jspa 记住邮箱,用户名,密码以备以后使用,一定牢记. 二.创建一个issu ...

  6. FileOutputSteam入门

    FileOutputSteam 字节输入流 从控制台将字节保存到本地硬盘 package com.isoftstone.io; import java.io.FileOutputStream; imp ...

  7. C#用Oracle.DataAccess中连接Oracle要注意版本问题!

    客户端Oracle.DataAccess.dll与服务器版本不一致时,如下修改:1.在客户端Web.config中,增加如下配置:<runtime> <assemblyBinding ...

  8. CSS3 transition实现超酷图片墙动画效果

    一.前面的感慨以前也陆陆续续试过CSS3的一些特性,文字投影,多边框等.但都是试试而已,知道有这么回事.今天,见到了一个新玩意,transition,认认真真的试了一下,经过,我懵了,我呆了,我傻了, ...

  9. List集合去除重复对象及equals()、hashCode()方法的作用

    原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...

  10. Vue.js开始第一个项目

    前端架构之路:使用Vue.js开始第一个项目   Vue.js做为目前前端最热门的库之一,为快速构建并开发前端项目多了一种思维模式.本文通过一个简单的实例开始上手Vue.js开发. 一.技术准备 使用 ...