Submission #787566

#TimeUsernameProblemLanguageResultExecution timeMemory
787566ymmShortcut (IOI16_shortcut)C++17
0 / 100
1 ms212 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) { 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,0,r+1) { ll x = min(-ps[i], -ps[r] + ps[i] - ps[l] + C); ans = max(ans, a[i] + x + mx); } 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; Loop (i,0,n-2) { int l = i+1, r = n-1; while (l < r) { int j = (l+r+1)/2; ll a = calc0(i, j); ll b = calcn(i, j); 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:43:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |   while (vecp < vec.size() && vec[vecp] <= i)
      |          ~~~~~^~~~~~~~~~~~
shortcut.cpp:46:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |    while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p)))
      |           ~~~~~^~~~~~~~~~~~
shortcut.cpp:51:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |   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...