Submission #513661

#TimeUsernameProblemLanguageResultExecution timeMemory
513661jcelinSIR (COI15_sir)C++14
100 / 100
236 ms86840 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef unsigned int ui; #define ii pair<ll,ll> #define vi vector<int> #define vii vector<ii> #define vLL vector<ll> #define matrix vector<vi> #define matrixLL vector<vll> #define vs vector<string> #define vui vector<ui> #define msi multiset<int> #define mss multiset<string> #define si set<int> #define ss set<string> #define PB push_back #define PF push_front #define PPB pop_back #define PPF pop_front #define X first #define Y second #define MP make_pair #define FOR(i, a, b) for (int i = int(a); i < int(b); i++) #define REP(i, n) FOR(i, 0, n) #define all(x) (x).begin(), (x).end() const int dx[] = {-1, 1, 0, 0}; const int dy[] = {0, 0, -1, 1}; const int dxx[] = {-1, 1, 0, 0, 1, 1, -1, -1}; const int dyy[] = {0, 0, -1, 1, -1, 1, -1, 1}; const string abc="abcdefghijklmnopqrstuvwxyz"; const string ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const ld pi = 3.14159265; const int mod = 1e9 + 7; const int MOD = 1e9 + 7; const int MAXN = 1e6 + 7; const int inf = mod; const ll INF = 1e18; const ll zero = ll(0); const int logo = 20; const int off = 1 << logo; const int trsz = off << 1; vii outer, inner, poi; ll ccw(ii a, ii b, ii c){ return a.X*(b.Y - c.Y) +b.X*(c.Y - a.Y) +c.X*(a.Y - b.Y); } ll P(ii a, ii b, ii c){ return abs(ccw(a,b,c)); } bool cmp(ii a, ii b){ if(a.X == b.X)return a.Y < b.Y; return a.X < b.X; } vii make_hull(vii p){ vii uhull, lhull, hull; ll n = p.size(); if(p.size()==1 or p.size()==2){ for(auto x: p){ hull.PB(x); } return hull; } uhull.push_back(p[0]); uhull.push_back(p[1]); for(ll i=2;i<n;i++){ while(uhull.size() >= 2 && ccw(uhull[uhull.size()-2], uhull[uhull.size()-1], p[i]) >=0) uhull.pop_back(); uhull.push_back(p[i]); } //for(ii i:uhull) printf("%d %d\n", i.X, i.Y); lhull.push_back(p[0]); lhull.push_back(p[1]); for(ll i=2;i<n;i++){ while(lhull.size() >= 2 && ccw(lhull[lhull.size()-2], lhull[lhull.size()-1], p[i]) <=0) lhull.pop_back(); lhull.push_back(p[i]); } for(ll i=0;i<lhull.size();i++) hull.push_back(lhull[i]); for(ll i=uhull.size()-2;i>0;i--) hull.push_back(uhull[i]); return hull; } void solve(){ ll n; cin >> n; outer.clear(); outer.resize(n); for(auto &x: outer) cin >> x.X >> x.Y; ll m; cin >> m; poi.clear(); poi.resize(m); for(auto &x: poi) cin >> x.X >> x.Y; sort(all(poi), cmp); inner = make_hull(poi); sort(all(outer), cmp); outer = make_hull(outer); for(ll j = 1e6 / m; j>=0; j--) for(ll i=0; i<m; i++) inner.PB(inner[i]); for(ll j = 1e6 / n; j>=0; j--)for(ll i=0; i<n; i++) outer.PB(outer[i]); ll tamo=0; ll ans=-INF, tmp=0; ll nexx=0; for(ll i=0; i<n; i++){ if(i!=0 and nexx>=i+1){ tmp-= (ll) P(outer[i-1], outer[i], outer[nexx]); } nexx=max(nexx, i+1); while(ccw(outer[i], inner[tamo], inner[tamo+1]) <= 0 and inner[tamo] != inner[tamo+1]) ++tamo; while(ccw(outer[i], inner[tamo], outer[nexx+1]) < 0){ //cout << i << " " << nexx << " " << nexx+1 << "\n"; tmp+= P(outer[i], outer[nexx], outer[nexx+1]); ++nexx; } //cout << "\n"; //cout << i << " " << tamo << " " << nexx << " " << tmp << "\n"; //if(i==3) break; ans=max(ans, (ll)tmp); } cout << (ll)ans << "\n"; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t=1; //cin >> t; while(t--)solve(); return 0; }

Compilation message (stderr)

sir.cpp: In function 'std::vector<std::pair<long long int, long long int> > make_hull(std::vector<std::pair<long long int, long long int> >)':
sir.cpp:89:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |     for(ll i=0;i<lhull.size();i++) hull.push_back(lhull[i]);
      |                ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...