이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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);
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |