답안 #421509

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
421509 2021-06-09T08:34:29 Z Kevin_Zhang_TW Shortcut (IOI16_shortcut) C++17
0 / 100
1 ms 204 KB
#include <bits/stdc++.h>
#include "shortcut.h"
using namespace std;
using ll = long long;
#define pb emplace_back
#define AI(i) begin(i), end(i)
template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); }
template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); }
#ifdef KEV
#define DE(args...) kout("[ " + string(#args) + " ] = ", args)
void kout() { cerr << endl; }
template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
template<class T> void debug(T l, T r) { while (l != r) cerr << *l << " \n"[next(l)==r], ++l; }
#else
#define DE(...) 0
#define debug(...) 0
#endif

const int MAX_N = 3010;
// inf is big enough
const ll inf = 1ll << 59;

int n, C;
ll pf[MAX_N], suf[MAX_N], loc[MAX_N];
ll pfd[MAX_N], sufd[MAX_N];

ll dis(int i, int j) {
	return abs(loc[i] - loc[j]);
}

vector<int> l, d;

void init() {
	for (int i = 0;i+1 < n;++i) {
		loc[i+1] = loc[i] + l[i];
	}

	{
		pfd[0] = pf[0] = d[0];
		for (int i = 1;i < n;++i) {
			pf[i] = max(pf[i-1], d[i] - loc[i]);
			pfd[i] = max(pfd[i-1], d[i] + loc[i] + pf[i-1]);
		}
	}
	{
		sufd[n-1] = suf[n-1] = d[n-1];
		for (int i = n-2;i >= 0;--i) {
			suf[i] = max(suf[i+1], d[i] - (loc[n-1] - loc[i]));
			sufd[i] = max(sufd[i+1], d[i] + (loc[n-1] - loc[i]) + suf[i+1]);
		}
	}

}
ll cal(int a, int b) {
	ll C = min((ll)::C, dis(a, b));
	ll res = max({pfd[a], sufd[b], pf[a] + suf[b] + loc[a] + (loc[n-1] - loc[b]) + C});

	ll ld = pf[a] + loc[a], rd = suf[b] + loc[n-1] - loc[b];

	for (int i = a;i <= b;++i) {
		// first to l, r
		ll tol = min(dis(i, a), dis(i, b) + C),
		   tor = min(dis(i, b), dis(i, a) + C);

		chmax(res, d[i] + max(tol + ld, tor + rd));

		for (int j = i+1;j <= b;++j) {
			ll dij = min(dis(i, j), C + dis(a, b) - dis(i, j));
			chmax(res, d[i] + d[j] + dij);
		}
	}

	DE(a, b, res);
	return res;
}

long long find_shortcut(int n, std::vector<int> l, std::vector<int> d, int c) {
	::n = n;
	::l = l;
	::d = d;
	C = c;

	init();

	ll res = pfd[n-1];

	for (int i = 0;i < n;++i) 
		for (int j = i+1;j < n;++j)
			chmin(res, cal(i, j));

	return res;
}

Compilation message

shortcut.cpp: In function 'll cal(int, int)':
shortcut.cpp:15:17: warning: statement has no effect [-Wunused-value]
   15 | #define DE(...) 0
      |                 ^
shortcut.cpp:73:2: note: in expansion of macro 'DE'
   73 |  DE(a, b, res);
      |  ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 0 ms 204 KB n = 9, 110 is a correct answer
3 Correct 0 ms 204 KB n = 4, 21 is a correct answer
4 Correct 0 ms 204 KB n = 3, 4 is a correct answer
5 Incorrect 1 ms 204 KB n = 2, incorrect answer: jury 62 vs contestant 71
6 Halted 0 ms 0 KB -