제출 #278627

#제출 시각아이디문제언어결과실행 시간메모리
278627eohomegrownappsShortcut (IOI16_shortcut)C++14
31 / 100
2053 ms39552 KiB
#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 = 0; a<n; a++){ //ll a = poss[xv]; //cout<<a<<'\n'; for (ll b = n-1; b>=a+1; b--){ if (mindist!=1e18&&c>=pathlength[b]-pathlength[a]){continue;} //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 = b; n>=a+1; 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 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...