灵魂宝石

【问题描述】 

“作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形”

我们知道,魔法少女的生命被存放于一个称为灵魂宝石(Soul Gem)的装置内。而有时,当灵魂宝石与躯体的距离较远时,魔法少女就无法控制自己的躯体了。在传说中,魔法少女Abel仅通过推理就得到了这个现象的一般法则,被称为Abel定理:存在宇宙常量R(是一个非负实数,或正无穷),被称为灵魂宝石常量,量纲为空间度量(即:长度)。如果某个魔法少女的灵魂宝石与她的躯体的距离严格超过R,则她一定无法控制自己的躯体;如果这个距离严格小于R,则她一定可以控制自己的躯体。(这里的距离指平面的 Euclid距离。)

注意:该定理不能预言距离刚好为R的情形。可能存在魔法少女A和B,她们离自己的灵魂宝石的距离都恰好为R,但是A可以控制自己的躯体,而B不可以。

现在这个世界上再也没有魔法少女了,但是我们却对这个宇宙常量感兴趣。我们只能通过之前的世界遗留下来的数据来确定这个常量的范围了。

每一组数据包含以下信息:

一共有N个魔法少女及她们的灵魂宝石,分别编号为1-N。

这N个魔法少女所在的位置是(Xi, Yi)。

这N个灵魂宝石所在的位置是(xi, yi)。

此时恰好有 K个魔法少女能够控制自己的躯体。

1.我们认为这个世界是二维的 Euclid 空间。

2.魔法少女与灵魂宝石之间的对应关系是未知的。

3.我们不知道是具体是哪 K个魔法少女能够控制自己的躯体。

根据以上信息,你需要确定灵魂宝石常量 R可能的最小值 Rmin 和最大值Rmax。

【输入格式】

第一行包两个整数:N、K。 
接下来N行,每行包含两个整数:Xi,Yi,由空格隔开。 
再接下来N行,每行包含两个整数:xi,yi,由空格隔开。

【输出格式】

输出两个量:Rmin、Rmax,中间用空格隔开。 
Rmin 一定是一个非负实数,四舍五入到小数点后两位。 
Rmax 可能是非负实数,或者是正无穷: 
如果是非负实数,四舍五入到小数点后两位; 
如果是正无穷,输出“+INF”(不包含引号)。

【输入样例】

2 1

1 0

4 0

0 0

4 4

【输出样例】

1.00 5.00

【数据范围】

对于100%的数据:

1 ≤ N ≤ 50,0 ≤ K ≤ N,-1000 ≤ xi,yi,Xi,Yi ≤ 1000。


题解:

题意:对于n个人与n个宝石,每个人需要各自匹配一1颗与其距离小于k的宝石,距离等于k的宝石可以自由选择是否匹配,求k的最小值与最大值

那么最小值可以很容易想到二分,连接所有距离小于k的边,用二分图匹配检验,则为用最大匹配数求最小值

然而最大值并不能直接像最小值一样求解,因为二分图求的是最大匹配,这一点模拟样例就可以得到

于是考虑一点小小的转化

最大值的检验中,我们将距离大于等于k的边相连

那么二分图匹配跑出的结果就是最大不匹配数

总个数减去最大不匹配数即为最小匹配数

利用最小匹配数就能求出最大值

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
struct shape
{
double x, y;
};
int n, k;
double l, r;
double ans;
int my[];
shape a[];
bool vis[];
int tot, to[], nex[], fir[];
inline double Dis(shape x, shape y)
{
return sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
}
inline void Ins(int x, int y)
{
nex[++tot] = fir[x];
fir[x] = tot;
to[tot] = y;
}
bool Find(int u)
{
for(int i = fir[u]; i; i = nex[i])
{
int v = to[i];
if(!vis[v])
{
vis[v] = true;
if(!my[v] || Find(my[v]))
{
my[v] = u;
return true;
}
}
}
return false;
}
inline bool Checkmi(double x)
{
tot = ;
for(int i = ; i <= n; ++i) my[i + n] = fir[i] = ;
for(int i = ; i <= n; ++i)
for(int j = n + ; j <= n + n; ++j)
if(Dis(a[i], a[j]) <= x)
Ins(i, j);
int sum = ;
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
vis[j + n] = false;
if(Find(i)) ++sum;
}
if(sum < k) return true;
return false;
}
inline bool Checkma(double x)
{
tot = ;
for(int i = ; i <= n; ++i) my[i + n] = fir[i] = ;
for(int i = ; i <= n; ++i)
for(int j = n + ; j <= n + n; ++j)
if(Dis(a[i], a[j]) >= x)
Ins(i, j);
int sum = ;
for(int i = ; i <= n; ++i)
{
for(int j = ; j <= n; ++j)
vis[j + n] = false;
if(Find(i)) ++sum;
}
if(sum < n - k) return false;
return true;
}
int main()
{
// freopen("soulgem.in", "r", stdin), freopen("soulgem.out", "w", stdout);
scanf("%d%d", &n, &k);
for(int i = ; i <= n + n; ++i)
scanf("%lf %lf", &a[i].x, &a[i].y);
l = , r = ;
for(int i = ; i <= ; ++i)
{
double mi = (l + r) / 2.0;
if(Checkmi(mi)) l = mi;
else ans = mi, r = mi;
}
printf("%.2lf ", ans);
ans = ;
l = , r = ;
for(int i = ; i <= ; ++i)
{
double mi = (l + r) / 2.0;
if(Checkma(mi)) ans = mi, l = mi;
else r = mi;
}
if(fabs(ans - ) <= 0.001) printf("+INF");
else printf("%.2lf", ans);
}

灵魂宝石 bzoj 2663的更多相关文章

  1. BZOJ 2663: [Beijing wc2012]灵魂宝石

    2663: [Beijing wc2012]灵魂宝石 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 108[Submit][S ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)

    2663: [Beijing wc2012]灵魂宝石 题目:传送门 题解: 又是一道卡精度的题目. 很容易就可以看出单调性啊,如果R越大,选的人就越多,R越小,选的人就越少. 那最小值就直接搞咯. 那 ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  6. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  7. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  8. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  9. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  2. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  3. UE4新手引导之下载和安装虚幻4游戏引擎

    1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...

  4. Opserver开源的服务器监控系统(ASP.NET)

    Opserver是Stack Exchange下的一个开源监控系统,系统本身由C#语言开发的ASP.NET(MVC)应用程序,无需任何复杂的应用配置,入门很快.下载地址:https://github. ...

  5. ls: 无法访问/usr/sbin/smartctl: 没有那个文件或目录

    环境:RHEL6.5 + Oracle 11.2.0.4 RAC 在安装RAC时,检查时缺少包 cvuqdisk-1.0.9-1,oracle提供脚本修复安装. 但在执行时报错: [root@orad ...

  6. .Net Core上用于代替System.Drawing的类库

    目前.Net Core上没有System.Drawing这个类库,想要在.Net Core上处理图片得另辟蹊径. 微软给出了将来取代System.Drawing的方案,偏向于使用一个单独的服务端进行各 ...

  7. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  8. 【SAP业务模式】之ICS(七):IDOC配置

    这是ICS业务模式系列的最后一篇了,主要讲解IDOC的配置. 一.指定EDI传输的供应商逻辑地址 事务代码:WEL1 注意:上面逻辑地址是生产公司+内部客户.有以下两种情形: 1.如果内部客户都是纯数 ...

  9. 14门Linux课程,打通你Linux的任督二脉!

    Linux有很多优点:安全.自主.开源--,也正是这些优点使得很多人都在学Linux. 虽说网上有大把的Linux课程资源,但是对很多小白来说网上的课程资源比较零散并不适合新手学习. 正因为此,总结了 ...

  10. 真正的汉化-PowerDesigner 16.5 汉化

    一.背景 经常使用PowerDesigner,之前使用15版本,后来16出来后,就一直在使用16,不过一直是英文.一些同事对使用英文版总显示有些吃力. 遍寻百度.必应,都没有找到真正的针对版本16的汉 ...