Advertisement
dmkozyrev

Educational Codeforces Round 2: Problem D

Apr 24th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4. #include <functional>
  5. #include <cassert>
  6. #include <cstdint>
  7. #include <algorithm>
  8.  
  9. typedef long double Real;
  10.  
  11. const Real PI = std::acos(-1.0L);
  12.  
  13. Real solve(Real x1, Real y1, Real r1, Real x2, Real y2, Real r2) {
  14.     assert(r1 >= r2);
  15.    
  16.     Real dist2 = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
  17.    
  18.     if (dist2 >= (r1+r2)*(r1+r2)) { // Если пересечений нет - ответ 0
  19.         return 0;
  20.     }
  21.    
  22.     // Если меньший круг лежит внутри большего: r1 >= dist + r2
  23.     if ((r1-r2)*(r1-r2) >= dist2) {
  24.         return PI * r2 * r2;
  25.     }
  26.    
  27.     std::function<Real(Real, Real, Real)> angle = [](Real a, Real b, Real c) {
  28.         // Вычисление угла angle напротив стороны a по теореме косинусов
  29.         // a^2 = b^2+c^2-2*b*c*cos(alpha)
  30.         return std::acos((b*b+c*c-a*a) / b / c / 2);
  31.     };
  32.    
  33.     std::function<Real(Real, Real)> S = [](Real r, Real angle) {
  34.         // площадь сектора минус площадь треугольника
  35.         // r - радиус круга, angle - угол между сторонами сектора
  36.         return r * r * (angle / 2 - std::sin(angle) / 2);
  37.     };
  38.    
  39.     Real  dist = std::sqrt(dist2);  // расстояние между центрами окружностей
  40.     Real alpha = 2 * angle(r2, r1, dist); // угол при большей окружности
  41.     Real  beta = 2 * angle(r1, r2, dist); // угол при меньшей окружности
  42.     return S(r1, alpha) + S(r2, beta);
  43. }
  44.  
  45. int main() {
  46.    // freopen("input.txt", "rt", stdin);
  47.    
  48.     Real x1, y1, r1, x2, y2, r2;
  49.     std::cin >> x1 >> y1 >> r1;
  50.     std::cin >> x2 >> y2 >> r2;
  51.    
  52.     if (r1 < r2) {
  53.         std::swap(x1, x2);
  54.         std::swap(y1, y2);
  55.         std::swap(r1, r2);
  56.     }
  57.    
  58.     std::cout << std::fixed << std::setprecision(6) << solve(x1, y1, r1, x2, y2, r2) << std::endl;
  59.    
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement