This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 1e9 + 7;
const ll LOGN = 20;
const ll MAXN = 2e5 + 5;
struct P {
ll x, y;
void read() {
cin >> x >> y;
}
P operator -(P other) {
return P{x - other.x, y - other.y};
}
bool operator <(P other) {
return make_pair(x, y) < make_pair(other.x, other.y);
}
ll operator *(P other) {
return x * other.y - y * other.x;
}
ll comp(P A, P B) {
return (A - *this) * (B - *this);
}
};
vector<P> pgon, pepper, hull, hull_now;
bool check(int l, int r, int in_hull) {
ll cmp = pgon[l].comp(pgon[r], hull[in_hull]);
if (cmp <= 0)
return false;
return true;
}
int main() {
fast
int N, M;
cin >> N;
pgon = vector<P>(N);
for (int i = 0; i < N; i++)
pgon[i].read();
cin >> M;
pepper = vector<P>(M);
for (int i = 0; i < M; i++)
pepper[i].read();
sort(pepper.begin(), pepper.end());
for (int rep = 0; rep < 2; rep++) {
for (auto u : pepper) {
while (hull_now.size() >= 2) {
P A = hull_now.end()[-2];
P B = hull_now.end()[-1];
if (A.comp(B, u) >= 0)
break;
hull_now.pop_back();
}
hull_now.push_back(u);
}
hull_now.pop_back();
for (auto u : hull_now)
hull.push_back(u);
hull_now.clear();
reverse(pepper.begin(), pepper.end());
}
if (hull.size() == 0)
hull.push_back(pepper[0]);
int n = hull.size();
int mx_hull = 0, mx_pgon = 0;
for (int i = 0; i < n; i++) {
if (hull[i].y > hull[mx_hull].y)
mx_hull = i;
}
for (int i = 0; i < N; i++) {
if (pgon[i].y > pgon[mx_pgon].y)
mx_pgon = i;
}
int hull_ind = mx_hull;
int r = (mx_pgon+1)%N;
ll area = 0;
ll ans = 0;
for (int l = mx_pgon; l < 3*N; l++) {
l %= N;
while (pgon[l].comp(hull[hull_ind], hull[(hull_ind + 1) % n]) < 0)
hull_ind = (hull_ind + 1) % n;
while (check(l, (r+1)%N, hull_ind)) {
area += pgon[l].comp(pgon[r], pgon[(r+1)%N]);
r = (r + 1) % N;
}
ans = max(ans, area);
area -= pgon[l].comp(pgon[(l+1)%N], pgon[r]);
if (l == (mx_pgon == 0 ? N-1 : mx_pgon-1))
break;
}
cout << ans << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |