제출 #921785

#제출 시각아이디문제언어결과실행 시간메모리
921785danikoynovShortcut (IOI16_shortcut)C++14
0 / 100
1 ms348 KiB
#include "shortcut.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 3010; const ll inf = 1e18; int n; ll cpos[maxn], cs[maxn], pref[maxn], bef[maxn], aft[maxn]; ll l[maxn], d[maxn], c; ll dist[maxn]; struct edge { int to; ll w; edge(int _to = 0, ll _w = 0) { to = _to; w = _w; } bool operator < (const edge &e) const { return w > e.w; } }; int used[maxn]; ll get_dist(int l, int r) { if (l > r) swap(l, r); return pref[r - 1] - pref[l - 1]; } const int maxlog = 21; struct sparse_table { ll dpos[maxlog][maxn]; int lg[maxn]; void build(vector < ll > values) { int len = values.size(); for (int i = 1; i <= len; i ++) { lg[i] = lg[i / 2] + 1; dpos[0][i] = values[i - 1]; } for (int j = 1; j < lg[len]; j ++) { for (int i = 1; i <= len - (1 << j) + 1; i ++) { dpos[j][i] = dpos[j - 1][i + (1 << (j - 1))]; if (dpos[j - 1][i] > dpos[j][i]) dpos[j][i] = dpos[j - 1][i]; } } } ll query(int l, int r) { if (l > r) return 0; int mlog = lg[r - l + 1] - 1; ll ans = dpos[mlog][r - (1 << mlog) + 1]; if (dpos[mlog][l] > ans) ans = dpos[mlog][l]; return ans; } }; struct point { ll x, y; point(ll _x = 0, ll _y = 0) { x = _x; y = _y; } }; struct rectangle { point centre; ll diagonal; rectangle(point _centre = point(), ll _diagonal = 0) { centre = _centre; diagonal = _diagonal; } }; ll pos[maxn]; struct event { int type; }; bool check(ll x) { ll ct[4] = {inf, inf, inf, inf}; /** 0 - up up 1 - up down 2 - down up 3 - down down */ for (int i = 1; i <= n; i ++) { for (int j = 1; j <= n; j ++) { if (j == i) continue; ll path = get_dist(i, j) + d[i] + d[j]; if (path <= x) continue; /// |x[i] - x[l]| + |x[j] - x[r]| + d[i] + d[j] + c<= k /// |x[l] - x[i]| + |x[r] - x[j]| <= k - d[i] - d[j] - c ct[0] = min(ct[0], x - d[i] - d[j] - c + pos[i] + pos[j]); ct[1] = min(ct[1], x - d[i] - d[j] - c + pos[i] - pos[j]); ct[2] = min(ct[2], x - d[i] - d[j] - c - pos[i] + pos[j]); ct[3] = min(ct[3], x - d[i] - d[j] - c - pos[i] - pos[j]); } } /**for (int i = 1; i <= n; i ++) for (int j = 1; j <= n; j ++) { if (pos[i] + pos[j] <= ct[0] && pos[i] - pos[j] <= ct[1] && - pos[i] + pos[j] <= ct[2] && - pos[i] - pos[j] <= ct[3]) return true; } return false;*/ for (int i = 1; i <= n; i ++) { ll top = inf, bot = -inf; /// pos[i] + pos[j] <= ct[0] ---- pos[j] <= ct[0] - pos[i] top = min(top, ct[0] - pos[i]); /// pos[i] - pos[j] <= ct[1] --- pos[j] >= pos[i] - ct[1] bot = max(bot, pos[i] - ct[1]); /// - pos[i] + pos[j] <= ct[2] --- pos[j] <= ct[2] + pos[i] top = min(top, ct[2] + pos[i]); /// -pos[i] - pos[j] <= ct[3] --- pos[j] >= - ct[3] - pos[i] bot = max(bot, - ct[3] - pos[i]); int lf = 1, rf = n; while(lf <= rf) { int mf = (lf + rf) / 2; if (pos[mf] < bot) lf = mf + 1; else rf = mf - 1; } if (lf > n) continue; if (pos[lf] <= top) return true; } return false; } ll find_shortcut(int N, vector<int> L, vector<int> D, int C) { n = N; c = C; for (int i = 0; i < n - 1; i ++) l[i + 1] = L[i]; for (int i = 0; i < n; i ++) d[i + 1] = D[i]; pos[1] = 0; for (int i = 2; i <= n; i ++) { pos[i] = pos[i - 1] + l[i - 1]; } for (int i = 1; i <= n; i ++) { pref[i] = pref[i - 1] + l[i]; } for (int i = 1; i <= n; i ++) { cpos[i] = cpos[i - 1] + l[i - 1]; cpos[i] = max(cpos[i], d[i]); bef[i] = bef[i - 1]; for (int j = 1; j < i; j ++) { bef[i] = max(bef[i], get_dist(i, j) + d[i] + d[j]); } } for (int i = n; i > 0; i --) { cs[i] = cs[i + 1] + l[i]; cs[i] = max(cs[i], d[i]); aft[i] = aft[i + 1]; for (int j = i + 1; j <= n; j ++) { aft[i] = max(aft[i], get_dist(i, j) + d[i] + d[j]); } } ll lf = 0, rf = inf; while(lf <= rf) { ll mf = (lf + rf) / 2; if (check(mf)) rf = mf - 1; else lf = mf + 1; } return lf; }
#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...