이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll find_shortcut(int n, vector<int> lv, vector<int> dv, int c){
ll l[1000000], d[1000000];
for (int i = 0; i<n-1; i++){
l[i]=lv[i];
}
for (int i = 0; i<n; i++){
d[i]=dv[i];
}
ll pathlength[1000000]={0};
pathlength[0]=0;
for (ll i = 1; i<n; i++){
pathlength[i]=pathlength[i-1]+l[i-1];
}
ll prefixmax[1000000]={0};
ll suffixmax[1000000]={0};
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];
}
ll prefixrangemax[1000000]={0};
ll suffixrangemax[1000000]={0};
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]);
}
}
ll endspluspath[1000000]={0};
ll endsminuspath[1000000]={0};
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';*/
/*ll poss[1000000];
for (int i = 0; i<n; i++){
poss[i]=i;
}
std::random_device rd;
std::mt19937 g(rd());
shuffle(poss,poss+n,g);*/
//for (ll xv = 0; xv<n; xv++){
for (ll a = n-2; a>=0; a--){
//ll a = poss[xv];
//cout<<a<<'\n';
for (ll b = n-1; b>=a+1; 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]);
}
if (mxdist>mindist){break;}
}
if (mxdist>mindist){continue;}
//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]);
if (mxdist>mindist){break;}
}
if (mxdist>mindist){break;}
}
//cout<<a<<' '<<b<<": "<<mxdist<<'\n';
mindist = min(mindist, mxdist);
}
}
return mindist;
}
컴파일 시 표준 에러 (stderr) 메시지
shortcut.cpp: In function 'll find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:55:9: warning: variable 'endspluspath' set but not used [-Wunused-but-set-variable]
55 | ll endspluspath[1000000]={0};
| ^~~~~~~~~~~~
shortcut.cpp:56:9: warning: variable 'endsminuspath' set but not used [-Wunused-but-set-variable]
56 | ll endsminuspath[1000000]={0};
| ^~~~~~~~~~~~~
# | 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... |