Submission #230813

#TimeUsernameProblemLanguageResultExecution timeMemory
230813walnutwaldo20Relay (COI16_relay)C++14
37 / 100
2095 ms6892 KiB
#include <bits/stdc++.h>

#define F0R(i, a) for (int i = 0; i < (int)(a); i++)

#define PB push_back
#define MP make_pair
#define X real()
#define Y imag()

#define F first
#define S second

using namespace std;

typedef long long ll;
typedef complex<ll> point;
typedef pair<point, point> edge;

#define MAXN 100000

bool prereaches[MAXN];
bool reaches[MAXN];

edge rev(edge e) { return MP(e.S, e.F); }

ll crossp(point p1, point p2) {
    return (conj(p1) * p2).Y;
}

bool rightof(point p, edge e) {
    bool ret = crossp(e.S - e.F, p - e.S) <= 0;
    return ret;
}

point get(vector<point>& v, int idx) {
    return v[(idx % (int)v.size() + (int)v.size()) % (int)v.size()];
}

point findtangent(vector<point>&hull, point p, bool seen1, bool seen2) {
    F0R(i, hull.size()) {
        edge edge1 = MP(get(hull, i - 1), hull[i]);
        edge edge2 = MP(hull[i], get(hull, i + 1));
        if (rightof(p, edge1) == seen1 && rightof(p, edge2) == seen2) {
            return hull[i];
        }
    }
    cout << "this should not print" << endl;
    exit(0);
}

bool inside(point p, vector<point>& hull) {
    F0R(i, hull.size()) {
        edge e = MP(hull[i], get(hull, i + 1));
        if (rightof(p, e)) {
            return false;
        }
    }
    return true;
}

void read(int& len, vector<point>& vec) {
    cin >> len;
    F0R(i, len) {
        ll x, y;
        cin >> x >> y;
        vec.PB(point(x, y));
    }
}

vector<point> v, hull;
vector<point> ls, rs;

bool cansee(int i, int j) {
    if (rightof(v[j], MP(v[i], rs[i])) || rightof(v[j], MP(ls[i], v[i]))) {
        return true;
    }
    vector<point> triangle;
    triangle.PB(v[i]);
    triangle.PB(rs[i]);
    triangle.PB(ls[i]);
    return inside(v[j], triangle);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m;
    read(n, v);
    read(m, hull);
    
    F0R(i, n) ls.PB(findtangent(hull, v[i], false, true));
    F0R(i, n) rs.PB(findtangent(hull, v[i], true, false));
    
    vector<int> v2;
    F0R(i, n) if (cansee(i, 0)) {
        v2.PB(i);
    }
    F0R(i, n) for (const int j : v2) {
        if (cansee(j, i)) {
            reaches[i] = true;
        }
    }
    
    int res = 0;
    F0R(i, n) if (reaches[i]) {
        res++;
    }
    cout << res - 1 << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...