Submission #595345

#TimeUsernameProblemLanguageResultExecution timeMemory
595345LucppShortcut (IOI16_shortcut)C++17
71 / 100
1941 ms524288 KiB
#include "shortcut.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = 1e18; int n; vector<ll> x; bool solve(const vector<tuple<ll, ll, ll>>& sq){ ll a = -INF, b = INF, c = INF, d = -INF; for(auto [xc, yc, r] : sq){ a = max(a, xc-r-yc); b = min(b, xc+r-yc); c = min(c, xc+r+yc); d = max(d, xc-r+yc); } if(a > b || c < d) return false; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(x[i]-x[j] >= a && x[i]-x[j] <= b && x[i]+x[j] <= c && x[i]+x[j] >= d){ return true; } } } return false; } ll find_shortcut(int n_, vector<int> len, vector<int> d, int c) { n = n_; x.resize(n); x[0] = 0; for(int i = 0; i < n-1; i++) x[i+1] = x[i]+len[i]; ll M = x.back()+*max_element(d.begin(), d.end())*2; ll lo = 0, hi = M; for(ll mid=(lo+hi)/2; lo<hi; mid=(lo+hi)/2){ vector<tuple<ll, ll, ll>> sq; for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){ if(abs(x[i]-x[j])+d[i]+d[j] <= mid) continue; sq.emplace_back(x[i], x[j], mid-c-d[i]-d[j]); } } if(solve(sq)) hi = mid; else lo = mid+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...