제출 #45218

#제출 시각아이디문제언어결과실행 시간메모리
45218realityShortcut (IOI16_shortcut)C++17
93 / 100
2066 ms215440 KiB
#include "bits/stdc++.h" using namespace std; #define fi first #define se second #define ll long long #define dbg(v) cerr<<#v<<" = "<<v<<'\n' #define vi vector<int> #define vl vector <ll> #define pii pair<int,int> #define mp make_pair #define db long double #define pb push_back #define all(s) s.begin(),s.end() #include "shortcut.h" template < class T > T smin(T &a,T b) {if (a > b) a = b;return a;} template < class T > T smax(T &a,T b) {if (a < b) a = b;return a;} const int N = (int)(1e6) + 5; const ll oo = 1e18 + 5; ll xx[N]; ll x[N]; ll y[N]; int ind[N]; int d[N]; int n,c; vector < ll > ss; struct st { ll mxsum,mnsum; ll mxdif,mndif; st(void) { mxsum = mxdif = oo; mnsum = mndif = -oo; } st(ll a,ll b,ll c,ll d) : mxsum(a),mnsum(b),mxdif(c),mndif(d) {} }; const st shit = st(oo,-oo,oo,-oo); st Comb(st a,st b) { st c; c.mxsum = min(a.mxsum,b.mxsum); c.mnsum = max(a.mnsum,b.mnsum); c.mxdif = min(a.mxdif,b.mxdif); c.mndif = max(a.mndif,b.mndif); return c; } st t[N * 4]; void U(int i,st v) { for (;i;i -= i&(-i)) t[i] = Comb(t[i],v); } st Q(int i) { st ans; for (;i <= n;i += i&(-i)) ans = Comb(ans,t[i]); return ans; } int F(ll dist) { ll mxsum = oo; ll mxdif = oo; ll mnsum = -oo; ll mndif = -oo; for (int i = 1;i <= n;++i) t[i] = shit; const int SZ = ss.size(); for (int i = n;i;--i) { int index = lower_bound(all(ss),y[i] + dist + 1) - ss.begin() + 1; if (index <= SZ) { st cnt = Q(index); smin(mxsum,dist - c + y[i] + cnt.mxsum); smax(mnsum,c - dist + x[i] + cnt.mnsum); smin(mxdif,dist - c + cnt.mxdif - x[i]); smax(mndif,c - dist + cnt.mndif - y[i]); } index = ind[i]; U(index,st(y[i],x[i],y[i],x[i])); } set < ll > S; for (int i = n;i;--i) { ll l1 = mndif + xx[i]; ll r1 = mxdif + xx[i]; smax(l1,mnsum - xx[i]); smin(r1,mxsum - xx[i]); auto index = S.lower_bound(l1); if (index != S.end() && *index <= r1) return 1; S.insert(xx[i]); } return 0; } ll find_shortcut(int shit0,vi shit1,vi shit2,int shit3) { n = shit0; c = shit3; for (int i = 2;i <= n;++i) x[i] = x[i - 1] + shit1[i - 2]; for (int i = 1;i <= n;++i) d[i] = shit2[i - 1]; for (int i = 1;i <= n;++i) { xx[i] = x[i]; y[i] = x[i] - d[i]; x[i] = x[i] + d[i]; } for (int i = 1;i <= n;++i) ss.pb(x[i]); sort(all(ss)); ss.resize(unique(all(ss)) - ss.begin()); for (int i = 1;i <= n;++i) ind[i] = lower_bound(all(ss),x[i]) - ss.begin() + 1; ll ans = oo; for (ll k = 1ll << 60;k;k /= 2) if (ans >= k && F(ans - k)) ans -= k; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...