제출 #83563

#제출 시각아이디문제언어결과실행 시간메모리
83563facelessThe Forest of Fangorn (CEOI14_fangorn)C++14
0 / 100
286 ms16892 KiB
#include <bits/stdc++.h> #define MP make_pair #define F first #define PB push_back #define S second using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; const int mod = (int)1e9 + 7; const int maxn = 1e4 + 4; const ll inf = 1e18; pii p[maxn]; vector <int> v[maxn]; pii operator + (pii fi, pii se) { return {fi.F + se.F, fi.S + se.S}; } pii operator - (pii fi, pii se) { return {fi.F - se.F, fi.S - se.S}; } int cross(pii A, pii B, pii C){ pii AB = B - A; pii AC = C - A; int cross = AB.F * AC.S - AB.S * AC.F; return cross; } int rob (pii x) { if (x.F >= 0 and x.S > 0) return 4; if (x.F > 0 and x.S <= 0) return 3; if (x.F <= 0 and x.S < 0) return 2; return 1; } bool cmp (int fi, int se) { int x = rob (p[fi]), y = rob (p[se]); if (x == y) return !cross ({0, 0}, p[fi], p[se]); return x > y; } bool isright (pii a, pii b, pii c) { if (cross (a, b, c) > 0) return 1; return 0; } int n; int district (int src, pii x) { int lo = 0, hi = n; while (hi - lo > 1) { int mid = (hi + lo) >> 1; pii AB = p[src] - p[v[src][0]]; pii AC = p[src] - p[v[src][mid]]; // cout << mid << " -> " << AB.F << " " << AB.S << " - " << AC.F << " " << AC.S << endl; if (isright (p[src], p[src] + AB, p[src] + AC)) { if (isright (p[src], p[src] + AB, x) and !isright (p[src], p[src] + AC, x)) { hi = mid; } else { lo = mid; } } else { if (isright (p[src], p[src] + AB, x) or !isright (p[src], p[src] + AC, x)) { hi = mid; } else { lo = mid; } } } return hi; } bool isinsame (int src, pii fi, pii se) { // cout << district (src, fi) << endl << district (src, se) << endl; if (district (src, fi) == district (src, se)) return 1; return 0; } pii c[maxn]; int main (){ ios_base::sync_with_stdio(false); int w, h; cin >> w >> h; pii s; cin >> s.F >> s.S; int number_of_camps; cin >> number_of_camps; for (int i = 0; i < number_of_camps; i++) cin >> c[i].F >> c[i].S; cin >> n; for (int i = 0; i < n; i++) cin >> p[i].F >> p[i].S; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) continue; v[i].PB (j); p[j].F = p[i].F - p[j].F; p[j].S = p[i].S - p[j].S; } sort (v[i].begin(), v[i].end(), cmp); for (int j = 0; j < n; j++) { if (j == i) continue; p[j].F -= p[i].F; p[j].F *= -1; p[j].S -= p[i].S; p[j].S *= -1; } } // for (auto it : v[3]) // cout << it << " "; // cout << endl; // isinsame (3, c[0], s); // return 0; vector <int> ans; for (int i = 0; i < number_of_camps; i++) { bool found = 0; for (int j = 0; j < n; j++) { // cout << i << " " << j << " -> " << isinsame (j, c[i], s) << endl; if (!isinsame (j, c[i], s)) { found = 1; break; } } if (!found) ans.PB (i + 1); } cout << ans.size() << endl; for (auto it : ans) cout << it << " "; cout << 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...