# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|
1270933 | | dosts | SIR (COI15_sir) | C++20 | | 116 ms | 33844 KiB |
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define all(x) x.begin(),x.end()
#define sp << " " <<
using namespace std;
const int N =3e6+10,MOD = 1e9+7,inf = 2e18;
bool ccw(pii a,pii b,pii c) {
return (c.ff-a.ff)*(b.ss-a.ss) < (c.ss-a.ss)*(b.ff-a.ff);
}
bool clockwise(pii a,pii b,pii c) {
return (c.ff-a.ff)*(b.ss-a.ss) > (c.ss-a.ss)*(b.ff-a.ff);
}
vector<pii> chull(vector<pii> pts) {
if (pts.size() < 3) return pts;
sort(all(pts));
vector<pii> ans;
vector<pii> stk;
stk.push_back(pts[0]);
for (int i = 1;i<pts.size();i++) {
while (stk.size() > 1 && ccw(stk[stk.size()-2],stk.back(),pts[i])) stk.pop_back();
stk.push_back(pts[i]);
}
stk.pop_back();
for (auto it : stk) ans.push_back(it);
stk.clear();
reverse(all(pts));
stk.push_back(pts[0]);
for (int i = 1;i<pts.size();i++) {
while (stk.size() > 1 && ccw(stk[stk.size()-2],stk.back(),pts[i])) stk.pop_back();
stk.push_back(pts[i]);
}
stk.pop_back();
for (auto it : stk) ans.push_back(it);
stk.clear();
return ans;
}
int area(pii a,pii b,pii c){
b.ff-=a.ff;
b.ss-=a.ss;
c.ff-=a.ff;
c.ss-=a.ss;
return abs(b.ff*c.ss-b.ss*c.ff);
}
void solve() {
int n;
cin >> n;
vector<pii> pizza(n);
for (int i = 0;i<n;i++) cin >> pizza[i].ff >> pizza[i].ss;
int m;
cin >> m;
vector<pii> peppers(m);
for (int i = 0;i<m;i++) cin >> peppers[i].ff >> peppers[i].ss;
peppers = chull(peppers);
reverse(all(peppers));
m = peppers.size();
vi tang(n,-1);
if (m == 1) for (int i =0 ;i<n;i++) tang[i] = 0;
else {
for (int i = 0;i<m;i++) {
if (!clockwise(pizza[0],peppers[i],peppers[(i+1)%m]) &&
clockwise(pizza[0],peppers[(i+m-1)%m],peppers[i])) {
assert(tang[0] == -1);
tang[0] = i;
}
}
int ptr = tang[0];
for (int i = 1;i<n;i++) {
while (clockwise(pizza[i],peppers[ptr],peppers[(ptr+1)%m])) ptr = (ptr+1)%m;
tang[i] = ptr;
}
}
int ans = 0;
int cur = 0;
int take = -1;
for (int i = 1;i<n;i++) {
if (clockwise(pizza[0],peppers[tang[0]],pizza[i])) {
take = i;
}
}
assert(take != -1);
for (int i=2;i<=take;i++) {
cur+=area(pizza[0],pizza[i-1],pizza[i]);
}
ans = cur;
int ptr = take;
for (int i=1;i<n;i++) {
int curr = cur;
cur-=area(pizza[i-1],pizza[i],pizza[ptr]);
while (clockwise(pizza[i],peppers[tang[i]],pizza[(ptr+1)%n])) {
cur+=area(pizza[i],pizza[ptr],pizza[(ptr+1)%n]);
ptr = (ptr+1)%n;
}
ans = max(ans,cur);
}
cout << ans << '\n';
}
signed main() {
ios_base::sync_with_stdio(0);cin.tie(0);
#ifdef Dodi
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t = 1;
//cin >> t;
while (t --> 0) solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |