이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll find_shortcut(int n, vector<int> l, vector<int> d, int c){
vector<ll> pathlength(n);
for (ll i = 1; i<n; i++){
pathlength[i]=pathlength[i-1]+l[i-1];
}
vector<ll> prefixmax(n);
vector<ll> suffixmax(n);
prefixmax[0]=pathlength[n-1]-pathlength[0]+d[0];
for (ll i = 1; i<n; i++){
prefixmax[i]=max(prefixmax[i-1],d[i]+pathlength[n-1]-pathlength[i]);
}
for (ll i = 0; i<n; i++){
prefixmax[i]-=pathlength[n-1]-pathlength[i];
}
suffixmax[n-1]=pathlength[n-1]-pathlength[0]+d[n-1];
for (ll i = n-2; i>=0; i--){
suffixmax[i]=max(suffixmax[i+1],d[i]+pathlength[i]-pathlength[0]);
}
for (ll i = 0; i<n; i++){
suffixmax[i]-=pathlength[i]-pathlength[0];
}
vector<ll> prefixrangemax(n);
vector<ll> suffixrangemax(n);
for (int i = 1; i<n; i++){
prefixrangemax[i]=prefixrangemax[i-1];
for (int j = 0; j<i; j++){
//from j to i
prefixrangemax[i]=max(prefixrangemax[i],d[i]+d[j]+pathlength[i]-pathlength[j]);
}
}
for (int i = n-2; i>=0; i--){
suffixrangemax[i]=suffixrangemax[i+1];
for (int j = i+1; j<n; j++){
//from j to i
suffixrangemax[i]=max(suffixrangemax[i],d[i]+d[j]+pathlength[j]-pathlength[i]);
}
}
vector<ll> endspluspath(n);
vector<ll> endsminuspath(n);
for (ll i = 0; i<n; i++){
endspluspath[i]=d[i]+pathlength[i];
endsminuspath[i]=d[i]-pathlength[i];
}
ll mindist = 1e18;
/*for (int i : prefixmax){
cout<<i<<' ';
}cout<<'\n';
for (int i : suffixmax){
cout<<i<<' ';
}cout<<'\n';*/
for (ll a = 0; a<n-1; a++){
for (ll b = a+1; b<n; b++){
//try express road linking a and b
ll mxdist = max(prefixrangemax[a],suffixrangemax[b]);
//try thing-on-left to thing-on-right
mxdist = max(mxdist,min(ll(c),pathlength[b]-pathlength[a])+suffixmax[b]+prefixmax[a]);
//try thing-on-left to middle, thing-on-right to middle
//segmenttree-ify
for (ll x = a; x<=b; x++){
if (x!=a){
mxdist = max(mxdist,
min(
pathlength[b]-pathlength[x]+c,
pathlength[x]-pathlength[a]
) + prefixmax[a] + d[x]);
}
if (x!=b){
mxdist = max(mxdist,
min(
pathlength[b]-pathlength[x],
pathlength[x]-pathlength[a]+c
) + suffixmax[b] + d[x]);
}
}
//try thing-on-middle to thing-on-middle
for (ll m = a; m<b; m++){
for (ll n = a+1; n<=b; n++){
//from m to n
mxdist = max(mxdist,
min(
c+pathlength[b]-pathlength[n]+pathlength[m]-pathlength[a],
pathlength[n]-pathlength[m]
)+d[n]+d[m]);
}
}
//cout<<a<<' '<<b<<": "<<mxdist<<'\n';
mindist = min(mindist, mxdist);
}
}
return mindist;
}
# | 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... |