답안 #278598

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
278598 2020-08-21T15:25:01 Z eohomegrownapps Shortcut (IOI16_shortcut) C++14
0 / 100
23 ms 39552 KB
#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){
	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';*/
	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]);
				}
				if (mxdist>mindist){break;}
			}
			if (mxdist>mindist){break;}
		
			//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;
}

Compilation message

shortcut.cpp: In function 'll find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:48:5: warning: variable 'endspluspath' set but not used [-Wunused-but-set-variable]
   48 |  ll endspluspath[1000000]={0};
      |     ^~~~~~~~~~~~
shortcut.cpp:49:5: warning: variable 'endsminuspath' set but not used [-Wunused-but-set-variable]
   49 |  ll endsminuspath[1000000]={0};
      |     ^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 23 ms 39552 KB n = 4, incorrect answer: jury 80 vs contestant 90
2 Halted 0 ms 0 KB -