Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define all(x) (x).begin(), (x).end()
- #define sz(x) (int)(x).size()
- typedef long double LD;
- struct point {
- LD x, y;
- point() {}
- point(LD _x, LD _y) : x(_x), y(_y) {}
- };
- vector < point > v(4);
- void rotate()
- {
- for(int i = 0; i < 5; i++)
- {
- v[i] = point(v[i].y, -v[i].x);
- }
- }
- LD ilo(point a, point b, point c)
- {
- return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
- }
- LD pole(vector < point > &vec)
- {
- LD ans = 0;
- for(int i = 0; i + 1 < sz(vec); i++)
- {
- ans += ilo(point(0, 0), vec[i], vec[i + 1]);
- }
- ans = ilo(point(0, 0), vec.back(), vec[0]);
- return abs(ans) / 2.0;
- }
- LD count()
- {
- LD yy = 0.5;
- for(int i = 0; i < 4; i++)
- {
- if(yy == v[i].y && yy == v[i + 1].y)
- {
- return 0;
- }
- }
- vector < point > my;
- for(int i = 0; i < 4; i++)
- {
- if(v[i].y >= yy) my.push_back(v[i]);
- if(min(v[i].y, v[i + 1].y) <= yy && yy <= max(v[i].y, v[i + 1].y))
- {
- 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;
- my.push_back(point(xx, yy));
- }
- }
- return pole(my) * 5.0;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- for(int i = 0; i < 4; i++)
- {
- LD x, y; cin >> x >> y;
- v.push_back(point(x, y));
- }
- reverse(all(v));
- v.push_back(v[0]);
- LD ans = 5 * 5 * 5 * 4;
- LD mn[] = {6, 4, 1, 3};
- for(int i = 0; i < 4; i++)
- {
- ans += count() * mn[i];
- rotate();
- }
- cout << fixed << setprecision(15) << ans / 125.0 << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement