灵魂宝石 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个非负整数 ...
随机推荐
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- 阿里云直播 C# SDK 如何使用
阿里云直播SDK的坑 1.直播云没有单独的SDK,直播部分被封装在CDN的相关SDK当中. 2.针对SDK,没有相关Demo. 3.针对SDK,没有相关的文档说明. 4.针对SDK的说明,官网上的说明 ...
- JS核心系列:浅谈 call apply 与 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- 使用 Roslyn 编译器服务
.NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...
- [译]ZOOKEEPER RECIPES-Leader Election
选主 使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志.主要思想是,使用一个znode,比如"/election",每个客 ...
- Partition:Partiton Scheme是否指定Next Used?
在SQL Server中,为Partition Scheme多次指定Next Used,不会出错,最后一次指定的FileGroup是Partition Scheme的Next Used,建议,在执行P ...
- php注册审核
通过注册审核,判断刚创建的账户是否可以使用. 后台管理员审核通过后,账号可以使用. 通过session 设置只能通过登录入口进入网页. 原理:通过数据库设置账号的一个字段状态,例: isok:1, i ...
- ASP.NET MVC学习之母版页和自定义控件的使用
一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...
- 我理解的MVC
前言 前一阶段对MVC模式及其衍生模式做了一番比较深入的研究和实践,这篇文章也算是一个阶段性的回顾和总结. 经典MVC模式 经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的 ...
- 第13章 Linux日志管理
1. 日志管理 (1)简介 在CentOS 6.x中日志服务己经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式其 ...