제출 #501651

#제출 시각아이디문제언어결과실행 시간메모리
501651blueShortcut (IOI16_shortcut)C++17
0 / 100
0 ms204 KiB
#include "shortcut.h" #include <vector> #include <iostream> using namespace std; using ll = long long; using vll = vector<ll>; const ll INF = 1'000'000'000'000'000'000LL; ll find_shortcut(int n, vector<int> track_len, vector<int> d, int c) { vll x(n, 0); for(int i = 1; i < n; i++) x[i] = x[i-1] + track_len[i-1]; ll lo = 1; ll hi = 1'000'000'000'000'000'000LL; vll y(n, 0); for(int i = 0; i < n; i++) y[i] = d[i]; ll l = c; while(lo != hi) { ll k = (lo+hi)/2; ll sum_lo = -INF; ll sum_hi = INF; ll diff_lo = -INF; ll diff_hi = INF; for(int i = 0; i < n; i++) { for(int j = i+1; j < n; j++) { if(y[i] + y[j] + x[j] - x[i] <= k) continue; sum_lo = max(sum_lo, (x[i] + y[i]) + (x[j] + y[j]) + l - k + 1); sum_hi = min(sum_hi, (x[i] - y[i]) + (x[j] - y[j]) + k - l); diff_hi = min(diff_hi, -(x[i] + y[i]) + (x[j] - y[j]) + k - l); diff_lo = max(diff_lo, -(x[i] - y[i]) + (x[j] + y[j]) + l - k); } } bool works = 0; for(int i = 0; i < n; i++) { for(int j = i+1; j < n; j++) { if(sum_lo <= x[i] + x[j] && x[i] + x[j] <= sum_hi) { if(diff_lo <= x[j] - x[i] && x[j] - x[i] <= diff_hi) { works = 1; } } } } if(works) hi = k; else lo = k+1; } return lo; }
#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...