[关闭]
@994495jj 2017-08-23T01:12:08.000000Z 字数 1143 阅读 750

hdu6097

201708 (ACM)计算几何----圆反演


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. typedef long long ll;
  11. typedef double db;
  12. typedef pair<int, int> pii;
  13. typedef vector<int> vi;
  14. //--------
  15. const db eps = 1e-8;
  16. int sign(db x) {
  17. return (x > eps) - (x < -eps);
  18. }
  19. db r;
  20. struct P {
  21. db x,y;
  22. P() {}
  23. P(db x,db y) {
  24. this -> x = x;
  25. this -> y = y;
  26. }
  27. P operator + (const P &c) const {
  28. return P(x + c.x, y + c.y);
  29. }
  30. P operator - (const P &c) const {
  31. return P(x - c.x, y - c.y);
  32. }
  33. P operator * (const db &c) const {
  34. return P(x * c, y * c);
  35. }
  36. P operator / (const db &c) const {
  37. return P(x / c, y / c);
  38. }
  39. };
  40. P read() {
  41. db x,y;scanf("%lf%lf",&x,&y);
  42. return P(x,y);
  43. }
  44. db dis(P a) {
  45. return sqrt(a.x*a.x+a.y*a.y);
  46. }
  47. db dis(P a, P b) {
  48. return dis(a - b);
  49. }
  50. P fanyan(P a) {
  51. db d = dis(a);
  52. db t = r * r / d / d;
  53. return a * t;
  54. }
  55. int main() {
  56. int T;scanf("%d", &T);
  57. while(T--) {
  58. scanf("%lf", &r);
  59. P a = read(), b = read();
  60. if(sign(dis(a)) <= 0) {
  61. printf("%.7f\n", r*2.0);
  62. continue;
  63. }
  64. P _a = fanyan(a), _b = fanyan(b);
  65. db d = dis((_a + _b) / 2);
  66. db ans = 0;
  67. if(sign(d - r) > 0) {
  68. P p1 = (a + b) / 2;
  69. db t = r / dis(p1);
  70. p1 = p1 * t;
  71. ans = dis(p1, a) * 2;
  72. } else {
  73. ans = dis(_a - _b);
  74. ans = ans * dis(a) / r;
  75. }
  76. printf("%.7f\n",ans);
  77. }
  78. return 0;
  79. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注