// UVa 109 - SCUD Busters #include <iostream> #include <stdio.h> #include <vector> #include <algorithm> #include <string.h> #include <cmath> using namespace std; struct point { int x, y; }; point piv; int cross(point c, point a, point b) { int x1 = a.x - c.x; int x2 = b.x - c.x; int y1 = a.y - c.y; int y2 = b.y - c.y; return x1 * y2 - x2 * y1; } bool operator <(point a, point b) { return cross(piv, a, b) < 0; } int main() { int n = 0, m; cin >> m; vector<point> p[20]; while (m != -1) { for (int j = 0; j < m; j++) { point pp; cin >> pp.x >> pp.y; p[n].push_back(pp); } n++; cin >> m; } double area[20]; point hull[20][101]; int h[20]; for (int i = 0; i < n; i++) { int mn = 0; for (int j = 1; j < p[i].size(); j++) if (p[i][j].x < p[i][mn].x || p[i][j].x == p[i][mn].x && p[i][j].y < p[i][mn].y) mn = j; piv = p[i][mn]; p[i][mn] = p[i][0]; p[i][0] = piv; sort(p[i].begin() + 1, p[i].end()); p[i].push_back(piv); hull[i][0] = p[i][0]; hull[i][1] = p[i][1]; h[i] = 2; for (int j = 2; j < p[i].size(); j++) { while (h[i] >= 2 && cross(hull[i][h[i] - 2], hull[i][h[i] - 1], p[i][j]) > 0) h[i]--; hull[i][h[i]++] = p[i][j]; } area[i] = 0; for (int j = 1; j < h[i]; j++) area[i] += hull[i][j - 1].x * hull[i][j].y - hull[i][j].x * hull[i][j - 1].y; area[i] /= 2; } double sol = 0; point fire; bool alive[101]; memset(alive, true, sizeof(alive)); while (cin >> fire.x >> fire.y) { for (int i = 0; i < n; i++) if (alive[i]) { bool mark = true; for (int j = 1; j < h[i]; j++) { if (cross(hull[i][j - 1], hull[i][j], fire) > 0) { mark = false; break; } } if (mark) { alive[i] = false; sol += area[i]; } } } printf("%.2f\n", abs(sol)); return 0; }
Saturday, June 6, 2015
UVa 109 - SCUD Busters
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment