Submission #787639

#TimeUsernameProblemLanguageResultExecution timeMemory
787639ymmShortcut (IOI16_shortcut)C++17
0 / 100
1 ms340 KiB
#include "shortcut.h" #include <bits/stdc++.h> #define Loop(x,l,r) for (ll x = (l); x < (r); ++x) #define LoopR(x,l,r) for (ll x = (r)-1; x >= (l); --x) typedef long long ll; typedef std::pair<ll,ll> pll; using namespace std; const int N = 3030; ll ps[N], a[N], C; int n; ll calcin(int l, int r) { #if 0 ll ans = 0; Loop (i,l,r+1) Loop (j,i+1,r+1) { ll x = ps[j] - ps[i]; ll y = ps[r] - ps[j] + ps[i] - ps[l] + C; ans = max(ans, min(x, y) + a[i] + a[j]); } return ans; #endif int p = l; vector<int> vec; int vecp = 0; auto cw = [&](int i, int j) { assert(l <= i && i <= r && l <= j && j <= r); if (i == j) return 0; int x = min(i, j); int y = max(i, j); ll v1 = ps[y] - ps[x]; ll v2 = C + ps[r] - ps[y] + ps[x] - ps[l]; if (v1 == v2) return 1; return (v1 < v2) ^ (i > j); }; auto dis = [&](int i, int j) { assert(l <= i && i <= r && l <= j && j <= r); if (i < j) return ps[j] - ps[i] + a[j] + a[i]; else return C + ps[r] - ps[i] + ps[j] - ps[l] + a[i] + a[j]; }; auto mod = [&](int x) { return (x-l)%(r-l+1)+l; }; ll ans = 0; Loop (i,l,r+1) { p = max<int>(p, i+1); while (vecp < vec.size() && vec[vecp] <= i) ++vecp; while (cw(i, mod(p))) { while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p))) vec.pop_back(); vec.push_back(p); ++p; } if (vecp < vec.size()) { ans = max(ans, dis(i, mod(vec[vecp]))); //cerr << i << ' ' << mod(vec[vecp]) << ' ' << dis(i, mod(vec[vecp])) << '\n'; } } return ans; } ll calc0(ll ansl, ll lx, int lp, int l, int r) { ll ans = calcin(l, r); ans = max(ans, ansl); ll mx = lx; Loop (i,lp,l) { ans = max(ans, ps[i] + a[i] + mx); mx = max(mx, a[i] - ps[i]); } Loop (i,l,r+1) { ll x = min(ps[i], ps[r] - ps[i] + ps[l] + C); ans = max(ans, a[i] + x + mx); } return ans; } ll calcn(ll ansr, ll rx, ll rrx, int lp, int rp, int l, int r) { ll ans = ansr; ll mx = rx; LoopR (i,r+1,rp) { ans = max(ans, a[i] - ps[i] + mx); mx = max(mx, a[i] + ps[i]); } LoopR (i,l,r+1) { ll x = min(-ps[i], -ps[r] + ps[i] - ps[l] + C); ans = max(ans, a[i] + x + mx); } ll x = min(0ll, C - (ps[r] - ps[l])); LoopR (i,lp,l) ans = max(ans, a[i] - ps[i] + mx + x); ans = max(ans, rrx + mx + x); return ans; } ll solve(int l1, int r1, int l2, int r2, ll xl, ll xr, ll ansl, ll ansr) { if (r1-l1 <= 0) return 1e18; int m = (l1+r1)/2; pll mn = {2e18, -1}; r2 = min(r2, n); Loop (i,max(m+1,l2),r2) { ll x = calc0(ansl, xl, l2, m, i); ll y = calcn(ansr, xr, xl, l2, r2, m, i); mn = min(mn, pll{max(x, y), i}); } ll ans = mn.first; //cerr << m << ": " << ans << " (" << l2 << ' ' << r2 << ")\n"; int p = mn.second; { int r22 = p+2; LoopR (i,r22,r2) { ansr = max(ansr, a[i] - ps[i] + xr); xr = max(xr, a[i] + ps[i]); } ans = min(ans, solve(l1, m, l2, r22, xl, xr, ansl, ansr)); } { int l22 = p-2; Loop (i,l2,l22) { ansl = max(ansl, ps[i] + a[i] + xl); xl = max(xl, a[i] - ps[i]); } ans = min(ans, solve(m+1, r1, l22, r2, xl, xr, ansl, ansr)); } return ans; } long long find_shortcut(int _n, std::vector<int> l, std::vector<int> d, int c) { n = _n; Loop (i,1,n) ps[i] = ps[i-1] + l[i-1]; Loop (i,0,n) a[i] = d[i]; C = c; ll ans = solve(0, n-1, 0, n, 0, 0, 0, 0); return ans; //ll ans = 1e18; //int p0 = 0, p1 = 1; //while (p0 < n-1) { // ll a = calc0(p0, p1); // ll b = calcn(p0, p1); // ans = min(ans, max(a, b)); // if (a <= b) { // ++p1; // } // if (a > b || p1 == n) { // ++p0; // p1 -= 4; // } // while (p0 >= p1) // ++p1; //} //Loop (i,0,n-1) { // int l = i+1, r = n-1; // while (l < r) { // int j = (l+r+1)/2; // if (a <= b) // l = j; // else // r = j-1; // } // ans = min(ans, max(calc0(i, l), calcn(i, l))); // if (l < n-1) // ans = min(ans, max(calc0(i, l+1), calcn(i, l+1))); //} return ans; }

Compilation message (stderr)

shortcut.cpp: In function 'll calcin(int, int)':
shortcut.cpp:52:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |   while (vecp < vec.size() && vec[vecp] <= i)
      |          ~~~~~^~~~~~~~~~~~
shortcut.cpp:55:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |    while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p)))
      |           ~~~~~^~~~~~~~~~~~
shortcut.cpp:60:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |   if (vecp < vec.size()) {
      |       ~~~~~^~~~~~~~~~~~
#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...