Submission #787606

#TimeUsernameProblemLanguageResultExecution timeMemory
787606ymmShortcut (IOI16_shortcut)C++17
71 / 100
1198 ms2352 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(int l, int r) { ll ans = calcin(l, r); ll mx = -1e18; Loop (i,0,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(int l, int r) { ll ans = 0; ll mx = -1e18; LoopR (i,r+1,n) { 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); } LoopR (i,0,l) { ll x = min(0ll, C - (ps[r] - ps[l])); ans = max(ans, a[i] - ps[i] + mx + x); } 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 = 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...