Submission #787587

#TimeUsernameProblemLanguageResultExecution timeMemory
787587ymmShortcut (IOI16_shortcut)C++17
38 / 100
2087 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) { 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; //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; Loop (i,0,n-1) { 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; }
#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...