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...