题目链接:XJOI - NOI2015-07 - B

题目分析

题意:过一个点 P 的所有直线,与点集 Q 的最小距离是多少?一条直线与点集的距离定义为点集中每个点与直线距离的最大值。

题解:二分答案,对于一个二分的距离,我们可以求出对于每个点的可用的极角范围,然后判断 n 个点的极角范围有没有交即可。

听起来非常简单..结果我发现细节很麻烦..

因为,极角的范围是环形的,如果限定在 [-PI, PI] 的范围内,跨越 -PI = PI 这条线的极角范围就很难处理。

然后两个环上的范围的交可能是两段,也是很难处理..

学习神犇的处理方式,对于每个极角范围,在左端点记上一个 1,右端点记上一个 -1,然后如果一个位置被 n 个区间包含,那么这个位置的前缀和就是 n 。

非常的和谐,看起来问题已经解决了...然而我发现神犇的做法还是有些细节无法理解..

比如区间的范围可能超出了 [-PI, PI] ....但是我已经想不清楚了...还是记住这种处理方式吧

照着神犇的代码写之后还是 TLE 了 2 个点,最后改了改 Eps 让二分次数减少了一些,终于过了。

并且向下保留 3 位小数,我这样写 printf("%.3f\n", Ans - 0.0005); 就会 WA 掉 1 个点。

这样写 AnsN = (int)(Ans * 1000); printf("%d.%03d\n", AnsN / 1000, AnsN % 1000); 才能 AC。

代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. #define Vector Point
  11. #define PI 3.14159265358979
  12.  
  13. inline void Read_Int(int &Num)
  14. {
  15. char c = getchar();
  16. bool Neg = false;
  17. while (c < '0' || c > '9')
  18. {
  19. if (c == '-') Neg = true;
  20. c = getchar();
  21. }
  22. Num = c - '0'; c = getchar();
  23. while (c >= '0' && c <= '9')
  24. {
  25. Num = Num * 10 + c - '0';
  26. c = getchar();
  27. }
  28. if (Neg) Num = -Num;
  29. }
  30.  
  31. typedef double LF;
  32.  
  33. inline LF gmin(LF a, LF b) {return a < b ? a : b;}
  34. inline LF gmax(LF a, LF b) {return a > b ? a : b;}
  35. inline LF Sqr(LF x) {return x * x;}
  36.  
  37. const LF Eps = 1e-6;
  38.  
  39. const int MaxN = 111111 + 5;
  40.  
  41. int n, Top, Tot;
  42.  
  43. LF dis[MaxN], ta[MaxN];
  44.  
  45. struct ES
  46. {
  47. LF Pos;
  48. int Num;
  49. ES() {}
  50. ES(LF a, int b) {Pos = a; Num = b;}
  51. } EQ[MaxN * 4];
  52.  
  53. inline bool Cmp(ES e1, ES e2)
  54. {
  55. return e1.Pos < e2.Pos;
  56. }
  57.  
  58. struct Point
  59. {
  60. LF x, y;
  61. Point() {}
  62. Point(LF a, LF b) {x = a; y = b;}
  63.  
  64. void Read()
  65. {
  66. int a, b;
  67. Read_Int(a); Read_Int(b);
  68. x = (LF)a; y = (LF)b;
  69. }
  70. } Px, P[MaxN];
  71.  
  72. inline LF Dis(Point p1, Point p2)
  73. {
  74. return sqrt(Sqr(p1.x - p2.x) + Sqr(p1.y - p2.y));
  75. }
  76.  
  77. bool Check(LF d)
  78. {
  79. LF l, r, t;
  80. Top = 0; Tot = n;
  81. for (int i = 1; i <= n; ++i)
  82. {
  83. if (dis[i] <= d)
  84. {
  85. --Tot;
  86. continue;
  87. }
  88. t = asin(d / dis[i]);
  89. l = ta[i] - t;
  90. r = ta[i] + t;
  91. EQ[++Top] = ES(l, 1);
  92. EQ[++Top] = ES(r, -1);
  93. if (ta[i] > 0)
  94. {
  95. EQ[++Top] = ES(l - PI, 1);
  96. EQ[++Top] = ES(r - PI, -1);
  97. }
  98. else
  99. {
  100. EQ[++Top] = ES(l + PI, 1);
  101. EQ[++Top] = ES(r + PI, -1);
  102. }
  103. }
  104. if (Top == 0) return true;
  105. int Cnt = 0;
  106. sort(EQ + 1, EQ + Top + 1, Cmp);
  107. for (int i = 1; i <= Top; ++i)
  108. {
  109. Cnt += EQ[i].Num;
  110. if (Cnt == Tot) return true;
  111. }
  112. return false;
  113. }
  114.  
  115. int main()
  116. {
  117. scanf("%d", &n);
  118. Px.Read();
  119. for (int i = 1; i <= n; ++i)
  120. {
  121. P[i].Read();
  122. dis[i] = Dis(P[i], Px);
  123. ta[i] = atan2(P[i].y - Px.y, P[i].x - Px.x);
  124. }
  125. LF l, r, mid, Ans;
  126. l = 0; r = 2000000;
  127. while (r - l >= Eps)
  128. {
  129. mid = (l + r) / 2.0;
  130. if (Check(mid))
  131. {
  132. Ans = mid;
  133. r = mid - Eps;
  134. }
  135. else l = mid + Eps;
  136. }
  137. int AnsN = (int)(Ans * 1000);
  138. printf("%d.%03d\n", AnsN / 1000, AnsN % 1000);
  139. return 0;
  140. }

  

[XJOI NOI02015训练题7] B 线线线 【二分】的更多相关文章

  1. X-NUCA 2017 web专题赛训练题 阳光总在风雨后和default wp

     0X0.前言 X-NUCA 2017来了,想起2016 web专题赛,题目都打不开,希望这次主办方能够搞好点吧!还没开赛,依照惯例会有赛前指导,放一些训练题让CTFer们好感受一下题目. 题目有一大 ...

  2. PAT乙级真题及训练题 1025. 反转链表 (25)

    PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...

  3. 9.19[XJOI] NOIP训练37

    上午[XJOI] NOIP训练37 T1 同余方程 Problem description 已知一个整数a,素数p,求解 $x^{2}\equiv a(mod p) $ 是否有整数解 Solution ...

  4. 日常 java+雅思+训练题1

    今天主要学了一些类似c中的一些语句,java也是一样类似的,只有一些点需要稍微注意一下,一些语句是新增的需要知道. 完完全全新学的知识就是class和instance的区别.如何创建实例.数据的封装. ...

  5. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  6. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  7. 2019牛客多校第二场H题(悬线法)

    把以前的题补补,用悬线求面积第二大的子矩形.我们先求出最大子矩阵的面积,并记录其行三个方向上的悬线长度.然后排除这个矩形,记得还得特判少一行或者少一列的情况 #include <bits/std ...

  8. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  9. 2016huas暑假集训训练题 G-Who's in the Middle

    题目链接:http://acm.hust.edu.cn/vjudge/contest/121192#problem/G 此题大意是给定一个数n 然后有n个数 要求求出其中位数  刚开始以为是按数学中的 ...

随机推荐

  1. vsftpd给root设置访问权限

    1:Linux下安装vsftpd之后,默认的配置是匿名用户可以登录,匿名帐户有两个:用户名:anonymous密码:空 用户名:ftp密码:ftp 2:如果要用匿名进行上传删除等操作需要配置其它参数. ...

  2. 为什么虚拟机上刚装的centos7只有lo回环网络接口?

    centos7默认安装时需要手动激活有线网卡.如果安装时没有激活,需要手动编辑vi /etc/sysconfig/network-scripts/下ifcfg-enoxxONBOOT="ye ...

  3. 最佳vim技巧

    最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim ...

  4. 《java JDK7 学习笔记》之键值对Map

    一.常用的Map操作类 1.使用HashMap Map也支持泛型语法,泛型的Map实例: 建立Map操作对象时,可以使用泛型语法指定键与值的类型.上图键使用String,值也使用String类型.要建 ...

  5. ASP.NET网络硬盘(文件上传,文件下载)

    文件上传: 界面: 前台代码: <body style="text-align: center; background-image: url(Images/bg6.bmp);" ...

  6. DevExpress的 ASPxGridview控件的自动配置效果

    [淘宝小店:http://shop107919332.taobao.com ] 软件运行界面.是不是很漂亮? 这里是系统配置页面,可以随时根据需要配置每张表的每个字段的显示顺序,可见与否,只读与否,编 ...

  7. 让progressDialog不会触摸消失

    项目中的进度菊花圈,在网络请求的时候会出现,但是手一触碰到屏幕,就会消失,看了下自己的设置,给对话框设置了该方法: progressDialog.setCancelable(true); 点击Prog ...

  8. unity3d环境安装指南: Unity 4.5.5 + Visual Studio 2010

    1. UnitySetup-4.5.5.exe 官网下载最新版本4.X 安装exe文件 2. Unity 4.x Pro Patch.exe 复制exe到安装目录下 C:\Program Files ...

  9. cocos2d-x实战 C++卷 学习笔记--第4章 字符串 __String类

    前言: <cocos2d-x实战C++卷>学习笔记.(cocos2d-x 是3.0版本) 介绍 cocos2d-x 通用的字符串类  __String . 使用cocos2d::__Str ...

  10. 关于css中的align-content属性详解

    align-content 作用: 会设置自由盒内部各个项目在垂直方向排列方式. 条件:必须对父元素设置自由盒属性display:flex;,并且设置排列方式为横向排列flex-direction:r ...