Submission #765785

#TimeUsernameProblemLanguageResultExecution timeMemory
765785SanguineChameleonShortcut (IOI16_shortcut)C++17
23 / 100
2064 ms4564 KiB
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;

const int maxn = 3e3 + 20;
const long long inf = 1e18L;
long long len[maxn];
long long max3[maxn][maxn];
long long max5[maxn][maxn];
long long max6[maxn][maxn];
int depth[maxn];
int n, c;

long long calc(long long lim) {
	for (int j = 1; j <= n; j++) {
		for (int i = 1; i < j; i++) {
			max3[i][j] = (i > 1 ? max3[i - 1][j] : -inf);
			long long d1 = - len[i] - len[j] + c + depth[i] + depth[j];
			long long d2 = len[j] - len[i] + depth[i] + depth[j];
			if (d2 > lim) {
				max3[i][j] = max(max3[i][j], d1);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = i + 2; j <= n; j++) {
			max3[i][j] = max(max3[i][j], max3[i][j - 1]);
		}
	}
	for (int j = 1; j <= n; j++) {
		for (int i = j - 1; i >= 1; i--) {
			max5[i][j] = (i + 1 < j ? max(max5[i + 1][j], max5[i][j - 1]) : -inf);
			long long d1 = len[i] - len[j] + c + depth[i] + depth[j];
			long long d2 = len[j] - len[i] + depth[i] + depth[j];
			if (d2 > lim) {
				max5[i][j] = max(max5[i][j], d1);
			}
		}
	}
	for (int j = n; j >= 1; j--) {
		for (int i = 1; i <= n; i++) {
			max6[i][j] = max((i > 1 ? max6[i - 1][j] : -inf), (j < n ? max6[i][j + 1] : -inf));
			long long d1 = len[j] - len[i] + c + depth[i] + depth[j];
			long long d2 = len[j] - len[i] + depth[i] + depth[j];
			if (d2 > lim) {
				max6[i][j] = max(max6[i][j], d1);
			}
		}
	}
	long long res = inf;
	for (int x = 1; x <= n; x++) {
		for (int y = x + 1; y <= n; y++) {
			long long mx = 0;
			for (int i = 1; i <= n; i++) {
				for (int j = i + 1; j <= x; j++) {
					if (len[j] - len[i] + depth[i] + depth[j] > lim) {
						mx = max(mx, inf);
					}
				}
			}
			for (int i = y; i <= n; i++) {
				for (int j = i + 1; j <= n; j++) {
					if (len[j] - len[i] + depth[i] + depth[j] > lim) {
						mx = max(mx, inf);
					}
				}
			}
			mx = max(mx, max3[x][y] + (len[x] + len[y]));
			for (int i = x; i <= y - 1; i++) {
				for (int j = y; j <= n; j++) {
					long long d1 = len[i] + len[j] + c + depth[i] + depth[j] - (len[x] + len[y]);
					long long d2 = len[j] - len[i] + depth[i] + depth[j];
					if (d2 > lim) {
						mx = max(mx, d1);
					}
				}
			}
			mx = max(mx, max5[x][y] + (len[y] - len[x]));
			mx = max(mx, max6[x][y] - (len[y] - len[x]));
			res = min(res, mx);
		}
	}
	return res;
}

long long dist[maxn * maxn];

long long find_shortcut(int _n, vector<int> _len, vector<int> _depth, int _c) {
	n = _n;
	c = _c;
	len[1] = 0;
	for (int i = 2; i <= n; i++) {
		len[i] = len[i - 1] + _len[i - 2];
	}
	for (int i = 1; i <= n; i++) {
		depth[i] = _depth[i - 1];
	}
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = i + 1; j <= n; j++) {
			dist[cnt++] = len[j] - len[i] + depth[i] + depth[j];
		}
	}
	sort(dist, dist + cnt, greater<>());
	long long res = dist[0];
	int lt = 0;
	int rt = cnt - 1;
	while (lt <= rt) {
		int mt = (lt + rt) / 2;
		long long mx = calc(dist[mt] - 1);
		if (mx < dist[mt]) {
			res = max(mx, dist[mt + 1]);
			lt = mt + 1;
		}
		else {
			rt = mt - 1;
		}
	}
	return res;
}
#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...