灵魂宝石

【问题描述】 

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

我们知道,魔法少女的生命被存放于一个称为灵魂宝石(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的边相连

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

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

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

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cstdio>
  6. #include<cmath>
  7. using namespace std;
  8. struct shape
  9. {
  10. double x, y;
  11. };
  12. int n, k;
  13. double l, r;
  14. double ans;
  15. int my[];
  16. shape a[];
  17. bool vis[];
  18. int tot, to[], nex[], fir[];
  19. inline double Dis(shape x, shape y)
  20. {
  21. return sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
  22. }
  23. inline void Ins(int x, int y)
  24. {
  25. nex[++tot] = fir[x];
  26. fir[x] = tot;
  27. to[tot] = y;
  28. }
  29. bool Find(int u)
  30. {
  31. for(int i = fir[u]; i; i = nex[i])
  32. {
  33. int v = to[i];
  34. if(!vis[v])
  35. {
  36. vis[v] = true;
  37. if(!my[v] || Find(my[v]))
  38. {
  39. my[v] = u;
  40. return true;
  41. }
  42. }
  43. }
  44. return false;
  45. }
  46. inline bool Checkmi(double x)
  47. {
  48. tot = ;
  49. for(int i = ; i <= n; ++i) my[i + n] = fir[i] = ;
  50. for(int i = ; i <= n; ++i)
  51. for(int j = n + ; j <= n + n; ++j)
  52. if(Dis(a[i], a[j]) <= x)
  53. Ins(i, j);
  54. int sum = ;
  55. for(int i = ; i <= n; ++i)
  56. {
  57. for(int j = ; j <= n; ++j)
  58. vis[j + n] = false;
  59. if(Find(i)) ++sum;
  60. }
  61. if(sum < k) return true;
  62. return false;
  63. }
  64. inline bool Checkma(double x)
  65. {
  66. tot = ;
  67. for(int i = ; i <= n; ++i) my[i + n] = fir[i] = ;
  68. for(int i = ; i <= n; ++i)
  69. for(int j = n + ; j <= n + n; ++j)
  70. if(Dis(a[i], a[j]) >= x)
  71. Ins(i, j);
  72. int sum = ;
  73. for(int i = ; i <= n; ++i)
  74. {
  75. for(int j = ; j <= n; ++j)
  76. vis[j + n] = false;
  77. if(Find(i)) ++sum;
  78. }
  79. if(sum < n - k) return false;
  80. return true;
  81. }
  82. int main()
  83. {
  84. // freopen("soulgem.in", "r", stdin), freopen("soulgem.out", "w", stdout);
  85. scanf("%d%d", &n, &k);
  86. for(int i = ; i <= n + n; ++i)
  87. scanf("%lf %lf", &a[i].x, &a[i].y);
  88. l = , r = ;
  89. for(int i = ; i <= ; ++i)
  90. {
  91. double mi = (l + r) / 2.0;
  92. if(Checkmi(mi)) l = mi;
  93. else ans = mi, r = mi;
  94. }
  95. printf("%.2lf ", ans);
  96. ans = ;
  97. l = , r = ;
  98. for(int i = ; i <= ; ++i)
  99. {
  100. double mi = (l + r) / 2.0;
  101. if(Checkma(mi)) ans = mi, l = mi;
  102. else r = mi;
  103. }
  104. if(fabs(ans - ) <= 0.001) printf("+INF");
  105. else printf("%.2lf", ans);
  106. }

灵魂宝石 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. Centos 下 mysql root 密码重置

    重置mysql密码的方法有很多,官网也提供了很方便的快捷操作办法,可参考资料 resetting permissions .本文重置密码的具体步骤如下: 一.停止MySQL(如果处于运行状态) #se ...

  2. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  3. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

  4. JQuery easyUI DataGrid 创建复杂列表头(译)

    » Create column groups in DataGrid The easyui DataGrid has ability to group columns, as the followin ...

  5. ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件

    作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...

  6. AbpZero--2.如何启动

    1.直接启动 VS中直接启动 2.IIS站点 IIS中配置一个站点来启动(推荐) 3.登录 系统默认创建2个用户 默认用户名:admin 密码:123qwe 租户:Default  默认用户名:adm ...

  7. 【HTML】Html页面跳转的5种方式

    目录结构: // contents structure [-] html实现 javascript方式实现 结合了倒数的javascript实现(IE) 解决Firefox不支持innerText的问 ...

  8. “风投云涌”:那些被资本看中的IT企业的风光与辛酸

         进入七月份以来,纷享销客获得D轮融资1亿美元,撼动业界,资本与IT联姻令一部分创业者眼红的同时,没有人注意到背后的风险. 科技与资本的结合,是当今经济社会前行的宏大主题.相关统计显示,软件行 ...

  9. 流程表单中js如何清空SheetUser控件数据?

    昨天有人问我js怎么清空.我试了试,发现简单的赋给他空值,并没有用.只能给他赋一个真实存在的值才有用.于是跟踪了一下他的删除按钮. 效果如下 使用场景:可以根据字段的不同类别变更人员. js代码如下, ...

  10. H3 BPM让天下没有难用的流程之技术特性

    一.集成性  H3 BPM可以与其它系统进行多个层面的集成,满足企业的针对不同系统的集成需求. 图:多种集成维度 Ø  用户集成 可与企业现有系统进行组织架构同步或调用,也可以直接与AD 进行集成. ...