Submission #421675

# Submission time Handle Problem Language Result Execution time Memory
421675 2021-06-09T10:46:29 Z Kevin_Zhang_TW Shortcut (IOI16_shortcut) C++17
0 / 100
1 ms 204 KB
#pragma GCC optimize("Ofast")
#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 get_dia(int a, int b) {
	int m = b - a + 1;

	ll all = dis(a, b) + C;

	vector<ll> ml, md;
	ml.pb(0);

	for (int i = a;i <= b;++i) {
		if (i < b) ml.pb(l[i]);
		md.pb(d[i]);
	}
	ml.pb(C);

	for (int i = a;i <= b;++i) 
		if (i < b) ml.pb(l[i]);

	for (int i = 0;i < m;++i) {
		md.pb(md[i]);
	}

	for (int i = 1;i < m+m;++i)
		ml[i] += ml[i-1];

	ll res = 0;

	deque< pair<ll,ll> > dq;

	for (int i = 0, j = 0;i < m;++i) {

		auto push_in = [&](int id, ll v) {
			while (dq.size()) {
				auto [j, jv] = dq.back();
				if (v <= jv) break;
				dq.pop_back();
			}
			dq.pb(id, v);
		};
		while (j < m + m) {
			if (2 * (ml[j] - ml[i]) > all) break;
			push_in(j, ml[j] + md[j]), ++j;
		}
		while (dq.size() && dq[0].first == i) dq.pop_front();

		if (dq.size()) {
			chmax(res, md[i] + dq[0].second - ml[i]);
		}
	}
	return res;
}


ll ans;

ll outer(int a, int b) {
	ll C = min((ll)::C, dis(a, b));

	ll ld = dis(0, a) + pf[a], rd = dis(b, n-1) + suf[b];

	ll res = max({pfd[a], sufd[b], 
			ld + rd + C});
	return res;
}
ll cal(int a, int b) {
	//if (C >= dis(a, b)) return inf - b;
	ll C = min((ll)::C, dis(a, b));

	ll ld = dis(0, a) + pf[a], rd = dis(b, n-1) + suf[b];

	ll res = max({pfd[a], sufd[b], 
			ld + rd + C});

	//if (res >= ans) return res;

	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);

		if (i > a) chmax(res, d[i] + tol + ld);
		if (i < b) chmax(res, d[i] + tor + rd);

		//if (res >= ans) return res;
	}

	return max(res, get_dia(a, b));
}

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();

	ans = pfd[n-1];

	function<void(int,int,int,int)> dcop = [&](int l, int r, int sl, int sr) {
		if (l > r) return;
		int mid = l + r >> 1;
		int bl = -1, br = -1;
		ll cur = inf;
		for (int i = sl;i <= sr && i < mid;++i) {
			ll v = cal(i, mid);
			if (chmin(cur, v))
				bl = br = i;
			else if (ans == v) br = i;
//			if (chmin(ans, cal(i, mid)))
//				bst = i;
		}
		chmin(ans, cur);

		dcop(l, mid-1, sl, br);
		dcop(mid+1, r, bl, sr);

	};

	dcop(0, n-1, 0, n-1);

//	for (int i = 0;i < n;++i) {
//		DE(i);
//
//		int l = i+1, r = n-1, mid;
//
//		if (l > r) continue;
////
//		ll ii = cal(i, i+1);
//		while (l < r) {
//			mid = l + r >> 1;
//			if (dis(i, mid) <= C) {
//				l = mid+1;
//				continue;
//			}
//			ll qa = cal(i, mid), qb = cal(i, mid+1);
//			if (qa == qb) {
//				if (ii == qa)
//					l = mid+1;
//				else r = mid;
//			}
//			else if (qa < qb) 
//				r = mid;
//			else if (qa > qb) 
//				l = mid+1;
//		}
//		chmin(ans, cal(i, l));
//		chmin(ans, ii);
//
////		for (int j = l-50;j <= l+50;++j)
////			if (l+j > i && l+j < n)
////				chmin(ans, cal(i, l + j));
////		chmin(ans, cal(i, l));
//
////		ll lst = inf;
////		bool godn = true;
////		for (int j = i+1;j < n;++j) {
////			ll now = cal(i, j);
////			if (now > lst) {
////				godn = false;
////			}
////			if (godn) assert(now <= lst);
////			if (!godn) assert(now >= lst);
////			chmin(ans, now);
////			lst = now;
//////			chmin(ans, cal(i, j));
//////			DE(j, cal(i, j));
////		}
//	}

	return ans;
}

Compilation message

shortcut.cpp: In lambda function:
shortcut.cpp:156:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  156 |   int mid = l + r >> 1;
      |             ~~^~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB n = 4, 80 is a correct answer
2 Correct 1 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 1 ms 204 KB n = 3, 4 is a correct answer
5 Correct 0 ms 204 KB n = 2, 62 is a correct answer
6 Correct 1 ms 204 KB n = 2, 3 is a correct answer
7 Correct 1 ms 204 KB n = 3, 29 is a correct answer
8 Correct 1 ms 204 KB n = 2, 3 is a correct answer
9 Correct 0 ms 204 KB n = 2, 3 is a correct answer
10 Correct 0 ms 204 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 204 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 204 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 204 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 204 KB n = 4, 4000000000 is a correct answer
16 Correct 1 ms 204 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 204 KB n = 10, 1000000343 is a correct answer
18 Correct 0 ms 204 KB n = 10, 3189 is a correct answer
19 Correct 1 ms 204 KB n = 10, 7000000000 is a correct answer
20 Correct 0 ms 204 KB n = 5, 12 is a correct answer
21 Correct 1 ms 204 KB n = 5, 25 is a correct answer
22 Correct 1 ms 204 KB n = 2, 122 is a correct answer
23 Correct 0 ms 204 KB n = 10, 117 is a correct answer
24 Correct 0 ms 204 KB n = 10, 336 is a correct answer
25 Correct 1 ms 204 KB n = 10, 438 is a correct answer
26 Incorrect 1 ms 204 KB n = 10, incorrect answer: jury 206 vs contestant 217
27 Halted 0 ms 0 KB -