Submission #134827

#TimeUsernameProblemLanguageResultExecution timeMemory
134827ckodserShortcut (IOI16_shortcut)C++14
23 / 100
2062 ms4476 KiB
// ItnoE
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 505;
int n, wlen, D[N];
ll L[N], LL[N], F1[N][N], F2[N][N];
ll suff[N], pref[N];
inline ll Dist(int i, int j)
{
	return (abs(L[i] - L[j]));
}
inline ll Solve(int a, int b)
{
	ll tmpMx = 0;
	

	for (int i = 0; i < n; i ++)
		for (int j = i + 1; j < n; j ++)
			tmpMx = max(tmpMx, min({Dist(i, j), Dist(i, a) + Dist(b, j) + wlen, Dist(i, b) + Dist(a, j) + wlen}) + D[i] + D[j]);

	if (L[b] - L[a] <= wlen)
	{
		ll Mx = 0;
		for (int i = 0; i < n; i ++)
			for (int j = i + 1; j < n; j ++)
				Mx = max(Mx, L[j] - L[i] + D[i] + D[j]);
		return (Mx);
	}

	if (a > b) swap(a, b);

	ll Mx = max(pref[a], suff[b]);
	Mx = max(Mx, F2[a][0] + F1[b][n - 1] + wlen);

	{
		ll val = (L[a] + L[b] + wlen);
		int lb = upper_bound(LL + a, LL + b, val) - LL;

		/*for (lb = a; lb <= b; lb ++)
			if (2 * L[lb] > L[b] + L[a] + wlen)
				break;*/

		if (lb > a)
			Mx = max(Mx, F2[a][0] + F1[a + 1][lb - 1] + L[a + 1] - L[a]);
		if (lb < b)
			Mx = max(Mx, F2[a][0] + F2[b - 1][lb] + wlen + L[b] - L[b - 1]);
	}
	{
		ll val = (L[a] + L[b] - wlen) >> 1;
		int lb = upper_bound(L + 1, L + n, val) - L;

		Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
		Mx = max(Mx, F1[b][n - 1] + F1[a][lb - 1] + wlen);
	}

	/*int r = a;
	for (int k = a; k < b; k ++)
	{
		while (r <= b && 2 * L[r] <= L[b] - L[a] + 2 * L[k] + wlen)
			r ++;
		
		if (k + 1 <= r - 1)
			Mx = max(Mx, D[k] + F1[k + 1][r - 1] + L[k + 1] - L[k]);
		if (r <= b)
			Mx = max(Mx, D[k] + L[k] - L[a] + wlen + F2[b][r]);
	}*/
	assert(Mx <= tmpMx);
	return (tmpMx);
}
int64_t find_shortcut(int _n, vector < int > _L, vector < int > _D, int _c)
{
	n = _n; wlen = _c;
	for (int i = 0; i < n - 1; i ++)
		L[i + 1] = L[i] + _L[i];
	for (int i = 0; i < n; i ++)
		LL[i] = L[i] * 2LL;
	for (int i = 0; i < n; i ++)
		D[i] = _D[i];

	memset(F1, -63, sizeof(F1));
	memset(F2, -63, sizeof(F2));
	for (int i = 0; i < n; i ++)
	{
		F1[i][i] = D[i];
		for (int j = i + 1; j < n; j ++)
			F1[i][j] = max(F1[i][j - 1], D[j] + L[j] - L[i]);
	}
	for (int i = n - 1; i >= 0; i --)
	{
		F2[i][i] = D[i];
		for (int j = i - 1; j >= 0; j --)
			F2[i][j] = max(F2[i][j + 1], D[j] + L[i] - L[j]);
	}

	pref[0] = D[0];
	ll CMx = D[0];
	for (int i = 1; i < n; i ++)
	{
		CMx += L[i] - L[i - 1];
		pref[i] = max(pref[i - 1], CMx + D[i]);
		CMx = max(CMx, (ll)D[i]);
	}
	suff[n - 1] = D[n - 1];
	CMx = D[n - 1];
	for (int i = n - 2; i >= 0; i --)
	{
		CMx += L[i + 1] - L[i];
		suff[i] = max(suff[i + 1], CMx + D[i]);
		CMx = max(CMx, (ll)D[i]);
	}

	ll Mn = Solve(0, 0);

	for (int i = 0; i < n; i ++)
		for (int j = i + 1; j < n; j ++)
			Mn = min(Mn, Solve(i, j));
	return (Mn);
}
/*int main()
{
	int nn = 5;
	int cc = 0;
	vector < int > LL = {20, 20, 40, 20};
	vector < int > DD = {390, 5, 400, 400, 390};
	ll Mn = find_shortcut(nn, LL, DD, cc);
	printf("%lld\n", Mn);
}*/

Compilation message (stderr)

shortcut.cpp: In function 'int64_t find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:53:39: warning: array subscript is below array bounds [-Warray-bounds]
   Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
                               ~~~~~~~~^
shortcut.cpp:53:61: warning: array subscript is below array bounds [-Warray-bounds]
   Mx = max(Mx, F1[b][n - 1] + F2[b - 1][lb] + L[b] - L[b - 1]);
                                                      ~~~~~~~^
#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...