灵魂宝石 bzoj 2663
灵魂宝石
【问题描述】
“作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形”
我们知道,魔法少女的生命被存放于一个称为灵魂宝石(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的更多相关文章
- BZOJ 2663: [Beijing wc2012]灵魂宝石
2663: [Beijing wc2012]灵魂宝石 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 261 Solved: 108[Submit][S ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)
2663: [Beijing wc2012]灵魂宝石 题目:传送门 题解: 又是一道卡精度的题目. 很容易就可以看出单调性啊,如果R越大,选的人就越多,R越小,选的人就越少. 那最小值就直接搞咯. 那 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
随机推荐
- 读书笔记:《HTML5开发手册》--HTML5新的结构元素
读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- mybatis_常用标签
1.<where></where>标签的作用 可以动态的添加where关键字 可以自动去掉第一个拼接条件的and关键字 <where> <if test=&q ...
- PHP之时间和日期函数
// 时间日期函数 Time <?php date_default_timezone_set('UTC'); // 获取当前时间的时间戳 $time0 = mktime(); $time1 = ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- continue break 区别
在循环中有两种循环方式 continue , break continue 只是跳出本次循环, 不在继续往下走, 还是开始下一次循环 break 将会跳出整个循环, 此循环将会被终止 count = ...
- CSS常见技巧
一.CSS Sprite(雪碧图|精灵图)指什么? 有什么作用? CSS雪碧 即CSS Sprite,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法是将小图像和背景图片合并到一张图片上,然后利 ...
- 使用ENode框架前您需要了解的东西(初稿)
选择ENode意味着什么可能很多人还不太清楚.我简单整理了一下: 意味着你选择了:你需要做DDD领域建模.选择了事件驱动的架构.选择了CQRS架构.选择了最终一致性.选择了事件溯源.选择了分布式.这些 ...
- 【css3笔记】---- 渐变的秘密
<CSS揭秘>这本书非常不错,充满了干货和惊喜.以下主要是关于使用渐变做出来的一些效果的笔记.请用最新的现代浏览器观看. 首先要回顾下一个css语句: linear-gradient([ ...