제출 #1308072

#제출 시각아이디문제언어결과실행 시간메모리
1308072gkos5678SIR (COI15_sir)C++20
51 / 100
1095 ms15676 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define ppb pop_back #define all(v) v.begin(), v.end() #define ff first #define ss second typedef long long ll; typedef pair<ll, ll> ii; typedef vector<ii> vii; const int maxn = 3e5 + 7; const int inf = 1e9; int n, m; ii pv; vii p, r, ch; ll ccw(ii a, ii b, ii c){ return a.ff * (b.ss - c.ss) + b.ff * (c.ss - a.ss) + c.ff * (a.ss - b.ss); } bool comb(ii a, ii b){ if (a == pv) return 1; if (b == pv) return 0; ll f = ccw(pv, a, b); if (f > 0) return 1; if (f < 0) return 0; return (abs(a.ff - pv.ff) > (b.ff - pv.ff)); } vii convexhull(vii po){ if (po.size() < 3) return po; sort(all(po)); pv = po[0]; sort(all(po), comb); ch.clear(); ch.pb(po[0]); ch.pb(po[1]); int trsz = 1; for (int i = 2; i < po.size(); i++){ while(ch.size() > 1 && ccw(ch[trsz - 1], ch[trsz], po[i]) < 0){ trsz--; ch.ppb(); } if (trsz == 0 || ccw(ch[trsz - 1], ch[trsz], po[i]) > 0){ ch.pb(po[i]); trsz++; } } return ch; } int main(){ // ios_base::sync_with_stdio(0); // cin.tie(0); cout.tie(0); cin >> n; p.resize(n); for (int i = 0; i < n; i++) cin >> p[i].ff >> p[i].ss; cin >> m; r.resize(m); for (int i = 0; i < m; i++) cin >> r[i].ff >> r[i].ss; r = convexhull(r); m = r.size(); ll mx = 0; ll ans = 0; int trr = 0, tr = 0; ll uk = 0; for (int i = 0; i < n; i++){ if (i > 0) uk -= ccw(p[i - 1], p[i], p[trr]); while(true){ trr++; trr %= n; int prtr = tr, brit = 0; while(brit < m && ccw(p[i], p[trr], r[(tr + 1) % m]) <= ccw(p[i], p[trr], r[tr])) tr = (tr + 1) % m, brit++; if (ccw(p[i], p[trr], r[tr]) <= 0){ tr = prtr; trr = (trr + n - 1) % n; break; } uk += ccw(p[i], p[(trr + n - 1) % n], p[trr]); } ans = max(ans, uk); } cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...