Advertisement
Guest User

Untitled

a guest
Sep 20th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define all(x) (x).begin(), (x).end()
  5. #define sz(x) (int)(x).size()
  6.  
  7. typedef long double LD;
  8.  
  9. struct point {
  10.     LD x, y;
  11.     point() {}
  12.     point(LD _x, LD _y) : x(_x), y(_y) {}
  13. };
  14.  
  15. vector < point > v(4);
  16.  
  17. void rotate()
  18. {
  19.     for(int i = 0; i < 5; i++)
  20.     {
  21.         v[i] = point(v[i].y, -v[i].x);
  22.     }
  23. }
  24.  
  25. LD ilo(point a, point b, point c)
  26. {
  27.     return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
  28. }
  29.  
  30. LD pole(vector < point > &vec)
  31. {
  32.     LD ans = 0;
  33.     for(int i = 0; i + 1 < sz(vec); i++)
  34.     {
  35.         ans += ilo(point(0, 0), vec[i], vec[i + 1]);
  36.     }
  37.     ans = ilo(point(0, 0), vec.back(), vec[0]);
  38.     return abs(ans) / 2.0;
  39. }
  40.  
  41. LD count()
  42. {
  43.     LD yy = 0.5;
  44.     for(int i = 0; i < 4; i++)
  45.     {
  46.         if(yy == v[i].y && yy == v[i + 1].y)
  47.         {
  48.             return 0;
  49.         }
  50.     }
  51.     vector < point > my;
  52.     for(int i = 0; i < 4; i++)
  53.     {
  54.         if(v[i].y >= yy) my.push_back(v[i]);
  55.         if(min(v[i].y, v[i + 1].y) <= yy && yy <= max(v[i].y, v[i + 1].y))
  56.         {
  57.             LD xx = (yy - v[i + 1].y) / (v[i].y - v[i + 1].y) * (v[i].x - v[i + 1].x) + v[i + 1].x;
  58.             my.push_back(point(xx, yy));
  59.         }
  60.     }
  61.     return pole(my) * 5.0;
  62. }
  63.  
  64. int main()
  65. {
  66.     ios_base::sync_with_stdio(0);
  67.     for(int i = 0; i < 4; i++)
  68.     {
  69.         LD x, y; cin >> x >> y;
  70.         v.push_back(point(x, y));
  71.     }
  72.     reverse(all(v));
  73.     v.push_back(v[0]);
  74.  
  75.     LD ans = 5 * 5 * 5 * 4;
  76.     LD mn[] = {6, 4, 1, 3};
  77.     for(int i = 0; i < 4; i++)
  78.     {
  79.         ans += count() * mn[i];
  80.         rotate();
  81.     }
  82.     cout << fixed << setprecision(15) << ans / 125.0 << "\n";
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement