/*********************************************************************************
纠结了良久,这个题是DLX的重复覆盖问题,以前还没见过,最后套了晓天大牛的模板,水过了。
还是模板题。。。因为最后的答案必然是某两点的距离,所以离散化一下所有距离后二分再套用DLX
重复覆盖模板就能AC了~赞一下神函数unique_copy,这个模板的细节还是要很小心才行,
计数都要从1开始~
*********************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
const int INF_INT = 0x3f3f3f3f;
const double oo = 10e9;
const double eps = 10e-7;
const int MAXN = 104;
const int MAXM = MAXN * MAXN;
PII house[MAXN];
int test, n, m;
int dtop, dis[MAXM], laby[MAXN][MAXN];
int nodecnt;
int U[MAXM], L[MAXM], D[MAXM], R[MAXM], row[MAXM], col[MAXM];
int sz[MAXN];
bool vis[MAXN], maze[MAXN][MAXN];
int sqa_dist(const PII &pa, const PII &pb)
{
return (pa.first - pb.first) * (pa.first - pb.first) +
(pa.second - pb.second) * (pa.second - pb.second);
}
void initDLX(int mm)
{
memset(sz, 0, sizeof(sz));
memset(col, -1, sizeof(col));
nodecnt = mm + 1;
for (int i = 0; i <= mm; ++i)
{
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = i;
col[i] = i;
}
L[0] = mm;
R[mm] = 0;
sz[0] = INF_INT;
return ;
}
void insert(int id, int *tt, int c)
{
for (int i = 0; i < c; ++i, ++nodecnt)
{
int x = tt[i];
row[nodecnt] = id;
col[nodecnt] = x;
++sz[x];
U[nodecnt] = x;
D[nodecnt] = D[x];
U[ D[x] ] = nodecnt;
D[x] = nodecnt;
if (0 == i)
{
L[nodecnt] = R[nodecnt] = nodecnt;
}
else
{
L[nodecnt] = nodecnt - 1;
R[nodecnt] = nodecnt - i;
R[nodecnt - 1] = nodecnt;
L[nodecnt - i] = nodecnt;
}
}
return ;
}
void buildDLX(int key)
{
int tt[MAXN], c;
memset(maze, false, sizeof(maze));
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
maze[i][j] = (laby[i][j] <= key);
}
}
for (int i = 1; i <= n; ++i)
{
c = 0;
for (int j = 1; j <= n; ++j)
{
if (maze[i][j])
{
tt[c++] = j;
}
}
insert(i, tt, c);
}
return ;
}
void remove(int x)
{
for (int i = D[x]; i != x; i = D[i])
{
L[ R[i] ] = L[i];
R[ L[i] ] = R[i];
--sz[ col[i] ];
}
return ;
}
void resume(int x)
{
for (int i = U[x]; i != x; i = U[i])
{
L[ R[i] ] = i;
R[ L[i] ] = i;
++sz[ col[i] ];
}
return ;
}
int h()
{
memset(vis, false, sizeof(vis));
int res = 0;
for (int i = R[0]; i != 0; i = R[i])
{
if (vis[ col[i] ])
{
continue ;
}
vis[ col[i] ] = true;
++res;
for (int j = D[i]; j != i; j = D[j])
{
if (col[j] != 0)
{
for (int k = R[j]; k != j; k = R[k])
{
vis[ col[k] ] = true;
}
}
}
}
return res;
}
bool dfs(int step, int key)
{
if (h() + step > m)
{
return false;
}
if (0 == R[0])
{
return true;
}
int id = 0;
for (int i = R[0]; i != 0; i = R[i])
{
if (sz[i] < sz[id])
{
id = i;
}
}
for (int i = D[id]; i != id; i = D[i])
{
remove(i);
for (int j = R[i]; j != i; j = R[j])
{
remove(j);
}
if (dfs(step + 1, key))
{
return true;
}
for (int j = L[i]; j != i; j = L[j])
{
resume(j);
}
resume(i);
}
return false;
}
double bisearch()
{
int low = 0, high = dtop - 1, mid = (low + high) >> 1;
int res = mid, key;
while (low <= high)
{
mid = (low + high) >> 1;
key = dis[mid];
initDLX(n);
buildDLX(key);
if (dfs(0, key))
{
res = mid;
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return sqrt(dis[res] + 0.0);
}
void ace()
{
double ans;
for (scanf("%d", &test); test--; )
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d %d", &house[i].first, &house[i].second);
}
dtop = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
laby[i][j] = dis[dtop++] = sqa_dist(house[i], house[j]);
}
}
sort(dis, dis + dtop);
dtop = unique_copy(dis, dis + dtop, dis) - dis;
ans = bisearch();
printf("%.6lf\n", ans);
}
return ;
}
int main()
{
ace();
return 0;
}相关推荐
医学成像学习笔记(一):核磁共振成像(MRI)k空间为何是图像频谱详解
前言 k空间是核磁共振成像图像重建的核心,可能很多人像笔者一样第一次学时会非常疑惑,为何k空间是图像的频域空间,观其填充过程,明明是空域信号的采样填充呀。网上很少有文章讨论这个问题,所以笔者在此写下自己的理解,供大家参考。 MRI位置编码 现在的MRI一次扫描的是一个断层或者多个断层,所谓断层就是一个有厚度的面,通过z方向梯度场来选择。我们扫描一个断层的目的是为了获得该断层各位置的质子情况,它们携带着组织的性质信息,反应出来的就是信号强度。如果整个断层都采用相同的磁场强度,而我们只能得到一个断
[DLX重复覆盖] hdu 3656 Fire station
题意: N个点,再点上建M个消防站。 问消防站到每个点的最大距离的最小是多少。 思路: DLX直接二分判断TLE了。 这时候一个很巧妙的思路 我们求的距离一定是两个点之间的距离 因此我们把距离都求一遍排序一下。 然后用下标二分 这样就AC了。 代码: #include"stdio.h" #include"algorithm" #include"string.h" #inclu
INMP441麦克风与ESP32的I2S音频采集实战指南
本文提供了INMP441数字麦克风与ESP32开发板通过I2S接口进行高质量音频采集的完整实战指南。详细讲解了硬件连接、软件配置、数据读取及基础处理,并分享了常见的避坑技巧与性能优化建议,帮助开发者快速构建物联网音频应用。
hdu3656Fire station(DLX重复覆盖 + 二分)
题目请戳这里 题目大意:一个城市n个点,现在要建m个消防站,消防站建在给定的n个点中。求建m个消防站后,m个消防站要覆盖所有的n个点的覆盖半径最小。 题目分析:重复覆盖问题,DLX解决。不过要求覆盖半径最小,需要二分。虽然给的范围并不大,DLX毕竟还是暴力搜索,而且精度有6位小数,因此直接二分距离的话会TLE!解决方案是将图中任意2点的距离记录下来,去重后二分已知的距离。因为消防站建在给定的n
VSCode 降低适用版本并且关闭自动更新
官方表示,提高了远程服务器构建工具链的最低要求,更新了对 glibc 的要求,需要最低2.28版本。最快的方法是把vs code的版本降到1.85(为什么是这个版本呢?打开VS Code的官方网站(https://code.visualstudio.com/)通过查看可以知道,具体的版本没有直接显示分类,他是根据发布日期来分类的同时和版本匹配。在网站的顶部导航栏中找到”Updates”按钮,点击进入下载页面。找了半天一直没发现,原来就在紧挨着的下面。远程主机不满足运行vs code服务器的先决条件。
MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径
记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。
HDU 3656 Fire station(巧妙的二分+DLX重复覆盖)
题目地址 题意:给你n个城市,在这个n个城市中要修m个消防局,问在这个限制条件下使得每一个城市发生火灾所需要的最大救援长度最短,最短为多少。 思路:和HDU 2295 Radar一样,但是我们这里就不能直接二分枚举距离了,我看别人博客学到了一个巧妙的二分方法,因为要求最短,那么最短肯定是恰好是某个城市到消防局的距离,所有我们把城市与城市之间的距离离散出来,这样的话我们二分搜索下标,这样的话二分的
CANoe基础讲解01:从零开始使用CANoe轻松搭建你的第一个CAN网络
本文是一篇CANoe软件入门实操指南,逐步演示了如何从零创建并运行一个CAN FD仿真工程。内容包括:启动软件、配置硬件通道与网络、加载DBC数据库、使用CAPL编写仿真节点发送CAN报文,最终启动测量并在Trace窗口中查看通信结果。通过七个清晰步骤,帮助初学者快速掌握CANoe基本操作,完成首个可运行的仿真网络搭建
hdu 3656 Fire station 重复覆盖 DLX+二分答案 给出一些城市及一些救火站的坐标,要求这些救火站覆盖所有的城市,问从救火站到城市的最长时间至少是多少。
Problem Description A city's map can be seen as a two dimensional plane. There are N houses in the city and these houses can be seen as N
YonBIP 3.0 报表开发+报表超链接
用友报表开发
Qt入门教程【环境搭建篇】Qt6+Mingw+QMake+QtCreator
Qt Windows平台安装
HDU 3656 Fire station
Problem Description A city's map can be seen as a two dimensional plane. There are N houses in the city and these houses can be seen as N points P1 …… PN on the two dimensional plane. For simplicit
【YOLOv8改进-损失函数】 YOLOv8自带损失函数CIoU / DIoU / GIoU 详解,以及如何切换损失函数
在介绍YOLOv8中的各种Iou之前,我们先来了解了解目标检测中的损失函数。目标检测模型通常包含两类损失函数:类别损失(分类)和位置损失(回归)。这两类损失函数用于检测模型的最后一部分,根据模型的输出(类别和位置)以及实际标注框(类别和位置),分别计算类别损失和位置损失。
DLX(II)
From http://longxiaozhi.is-programmer.com/posts/24817.html Fire station Radar LBOY: 两个题目是同一个类型,用到的解题思想都是:二分答案 + DLX 判定!以第二个题目为例来说一下。 题目中限制条件,每个消防站可以供应几户人家,如果把消防站看成是行,将用户看成是列,那么问题就是一个“重
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
HDU 5046 Airport DLX
【题目大意】 有n个
Data-Structures-and-Algorithm-Analysis-in-Java.pdf
作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...
DLX题集
FZU 1686 神龙的难题 HDU1426 Sudoku Killer HDU1530 Maximum Clique HDU1603 A Puzzling Problem HDU2119 Matrix HDU2295 Radar HDU2518 Dominoes
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
HDU 4013 图论 树的最小表示
/******************************************************************************* 去年上海赛区热身赛的一道题,树的最小表示模板题。解法就是用二进制枚举所有可能的联通子图,然后 求所有联通子图的最小表示,要注意的是对于某一个联通子图,最小表示需要枚举联通子图里的所有的点,然 后从这些点开始进行dfs,dfs过程中进
HDU 4121 模拟
/**************************************************************************************************** 坑爹的模拟题~注意这两种情况:黑方的将能直接飞过去杀了红方的将,还有将走一步能把红方别的子给吃了。。。 ******************************************
HDU 3644 计算几何 模拟退火
/* * ===================================================================================== * * Filename: hdu3644.cpp * * Description: Calculate Geometry -- Simulated annealing * *
HDU 4049 状态压缩DP
/******************************************************************************* 去年北京赛区网络赛水题,状态压缩DP,一开始TLE,然后发现是没初始化,应该用空间换时间来着, 接着WA,搞了半天没搞明白。。。最后发现发现一个小小的纰漏~~~ 解法就是建立状态dp[M][1 << N],用第一个状态表示
HDU 1512 左式堆 + 并查集
/* * ===================================================================================== * * Filename: hdu1512.cpp * * Description: Leftist Heap + Union Find Set * * Version
HDU 4036 物理坑爹题
/******************************************************************************* 坑爹的地方比较多,首先所有质量都是没用的,因为无摩擦力;其次坐标最好都用double表示;还有那个 土豆是的坐标是相对于第一个peak的坐标,第四貌似有土豆可以不在peak的范围内。。。以后找min/max值 还是用第一个元素做标记
HDU 4123 树状DP+RMQ
/****************************************************************************************************************** 尼玛。。。神题。。。居然能卡RMQ的log2的。。。解法就是先用树状DP预处理整棵树,得到每个节点距离其他节点的最大值, 这个时间复杂度是O(n),然后在得到的
HDU 4031 树状数组 区间更新及点询问
/******************************************************************************* 去年成都赛区网络赛一道题,树状数组在区间更新中的应用。树状数组一般支持的是改点,查区间,但 是这道题要求的是改区间,查点,这就要变通一下,具体可以看代码,另外要考虑的一个问题是,如何统计? 这里的处理方法就是把总共的攻击次数-防御
HDU 4046 树状数组
/******************************************************************************* WA了N多次。。。结果是忘记初始化st数组了。。。悲剧得1B。。。 解法就是考虑修改位置id的字符,观察左右"wbw"是否被更改,如果被更改了,那么就更新下,这个地方要 特别小心。。。具体可以见代码~ ************
HDU 3657 网络流
/*************************************************************************************** 去年网络赛的一道题,现在看来也不是很难。做个HDU上那道方格取数的话,这道题大致就有想法了, 但这道题有个问题是,必选点的处理,我的做法是如果该点为偶数点,则在源点与该点间建一条流量为oo 的边,如果该点为奇数点,
1万+



被折叠的 条评论
为什么被折叠?



