Submission #932345

#TimeUsernameProblemLanguageResultExecution timeMemory
932345siewjhShortcut (IOI16_shortcut)C++17
38 / 100
387 ms4440 KiB
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 505;
const ll inf = 1e18;
ll pref[MAXN], mxdl[MAXN][MAXN], mxdr[MAXN][MAXN], pans[MAXN], sans[MAXN];

ll find_shortcut(int nums, vector<int> len, vector<int> br, int exp){
    pref[0] = 0;
    for (int i = 1; i < nums; i++) pref[i] = pref[i - 1] + len[i - 1];
    for (int l = 0; l < nums; l++){
		mxdl[l][l] = br[l];
		for (int i = l + 1; i < nums; i++) mxdl[i][l] = max(mxdl[i - 1][l] + len[i - 1], (ll)(br[i]));
	}
	for (int r = nums - 1; r >= 0; r--){
		mxdr[r][r] = br[r];
		for (int i = r - 1; i >= 0; i--) mxdr[i][r] = max(mxdr[i + 1][r] + len[i], (ll)(br[i]));
	}
	pans[0] = br[0];
	for (int i = 1; i < nums; i++) pans[i] = max(pans[i - 1], mxdl[i - 1][0] + len[i - 1] + br[i]);
	sans[nums - 1] = br[nums - 1];
	for (int i = nums - 2; i >= 0; i--) sans[i] = max(sans[i + 1], mxdr[i + 1][nums - 1] + len[i] + br[i]);
    ll ans = inf;
    for (int l = 0; l < nums; l++)
		for (int r = l + 1; r < nums; r++){
			ll expd = min((ll)(exp), pref[r] - pref[l]), res = mxdl[l][0] + expd + mxdr[r][nums - 1];
			res = max(res, pans[l]);
			res = max(res, sans[r]);
			for (int i = l + 1; i < r; i++){
				res = max(res, mxdl[l][0] + min(pref[i] - pref[l], pref[r] - pref[i] + expd) + br[i]);
				res = max(res, min(pref[r] - pref[i], pref[i] - pref[l] + expd) + mxdr[r][nums - 1] + br[i]);
			}
			for (int i = l + 1; i < r; i++){
				int lo = i, hi = r - 1, far;
				while (lo <= hi){
					int m = (lo + hi) >> 1;
					if (pref[m] - pref[i] <= pref[i] - pref[l] + expd + pref[r] - pref[m]){
						far = m;
						lo = m + 1;
					}
					else hi = m - 1;
				}
				if (far != i) res = max(res, br[i] + mxdr[i + 1][far] + len[i]);
				if (far != r - 1) res = max(res, br[i] + pref[i] - pref[l] + mxdl[r - 1][far + 1] + len[r - 1] + expd);
			}
			ans = min(ans, res);
		}
	return ans;
}

Compilation message (stderr)

shortcut.cpp: In function 'll find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:45:82: warning: 'far' may be used uninitialized in this function [-Wmaybe-uninitialized]
   45 |     if (far != r - 1) res = max(res, br[i] + pref[i] - pref[l] + mxdl[r - 1][far + 1] + len[r - 1] + expd);
      |                                                                              ~~~~^~~
#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...