Submission #225390

#TimeUsernameProblemLanguageResultExecution timeMemory
225390VEGAnnShortcut (IOI16_shortcut)C++14
71 / 100
496 ms2432 KiB
#include <bits/stdc++.h> #include "shortcut.h" using namespace std; typedef long long ll; const int N = 3010; const ll OO = 1e18; ll pf[N], dst[N], c; int n, mem_l[N], mem_r[N]; bool ok(ll mx){ bool was = 0; ll u = -1, d = -1, l = -1, r = -1; for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if (pf[j] - pf[i] + dst[j] + dst[i] > mx){ ll k = mx - dst[i] - dst[j] - c; if (k < 0) return 0; ll up = pf[j] + k, down = pf[j] - k; ll cu = up + pf[i]; ll cd = down + pf[i]; ll cl = pf[i] - (up + pf[i]) / 2; ll cr = pf[i] - (down + pf[i]) / 2; if (!was){ was = 1; u = cu; d = cd; l = cl; r = cr; } else { u = min(u, cu); d = max(d, cd); if (u < d) return 0; l = max(l, cl); r = min(r, cr); if (r < l) return 0; } } if (!was) return 1; int l1 = 0, r1 = -1; int l2 = -1, r2 = 0; for (int i = n - 1; i >= 0; i--){ while (l1 < n && pf[l1] + pf[i] < d) l1++; while (r1 + 1 < n && pf[r1 + 1] + pf[i] <= u) r1++; mem_l[i] = l1; mem_r[i] = r1; } for (int i = 0; i < n; i++) { while (l2 < n - 1 && (pf[i] - pf[l2 + 1]) / 2 >= l) l2++; while (r2 < n && (pf[i] - pf[r2]) / 2 > r) r2++; int j1 = max(mem_l[i], r2), j2 = min(mem_r[i], l2); if (j1 > j2) continue; if (j1 == j2){ if (j1 != i) return 1; } else return 1; } return 0; } long long find_shortcut(int N, std::vector<int> l, std::vector<int> d, int C){ n = N; c = C * 2; assert(n <= 3000); pf[0] = 0; for (int i = 0; i < n - 1; i++) { pf[i + 1] = pf[i] + l[i] * 2; dst[i] = d[i] * 2; } dst[n - 1] = d[n - 1] * 2; // smth smaller ll l1 = 0, r1 = OO; while (l1 < r1){ ll md = (l1 + r1) >> 1; if (ok(md)) r1 = md; else l1 = md + 1; } ok(22); return l1 / 2; }
#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...