답안 #787649

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
787649 2023-07-19T10:40:30 Z ymm Shortcut (IOI16_shortcut) C++17
0 / 100
1 ms 212 KB
#include "shortcut.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (l); --x)
typedef long long ll;
typedef std::pair<ll,ll> pll;
using namespace std;

const int N = 1000010;
ll ps[N], a[N], C;
int n;

ll calcin(int l, int r)
{
#if 0
	ll ans = 0;
	Loop (i,l,r+1) Loop (j,i+1,r+1) {
		ll x = ps[j] - ps[i];
		ll y = ps[r] - ps[j] + ps[i] - ps[l] + C;
		ans = max(ans, min(x, y) + a[i] + a[j]);
	}
	return ans;
#endif
	int p = l;
	vector<int> vec;
	int vecp = 0;
	auto cw = [&](int i, int j) {
		assert(l <= i && i <= r && l <= j && j <= r);
		if (i == j)
			return 0;
		int x = min(i, j);
		int y = max(i, j);
		ll v1 = ps[y] - ps[x];
		ll v2 = C + ps[r] - ps[y] + ps[x] - ps[l];
		if (v1 == v2)
			return 1;
		return (v1 < v2) ^ (i > j);
	};
	auto dis = [&](int i, int j) {
		assert(l <= i && i <= r && l <= j && j <= r);
		if (i < j)
			return ps[j] - ps[i] + a[j] + a[i];
		else
			return C + ps[r] - ps[i] + ps[j] - ps[l] + a[i] + a[j];
	};
	auto mod = [&](int x) {
		return (x-l)%(r-l+1)+l;
	};
	ll ans = 0;
	Loop (i,l,r+1) {
		p = max<int>(p, i+1);
		while (vecp < vec.size() && vec[vecp] <= i)
			++vecp;
		while (cw(i, mod(p))) {
			while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p)))
				vec.pop_back();
			vec.push_back(p);
			++p;
		}
		if (vecp < vec.size()) {
			ans = max(ans, dis(i, mod(vec[vecp])));
			//cerr << i << ' ' << mod(vec[vecp]) << ' ' << dis(i, mod(vec[vecp])) << '\n';
		}
	}
	return ans;
}

#if 0
ll calc0(ll ansl, ll lx, int lp, int l, int r)
{
	ll ans = calcin(l, r);
	ans = max(ans, ansl);
	ll mx = lx;
	Loop (i,lp,l) {
		ans = max(ans, ps[i] + a[i] + mx);
		mx = max(mx, a[i] - ps[i]);
	}
	Loop (i,l,r+1) {
		ll x = min(ps[i], ps[r] - ps[i] + ps[l] + C);
		ans = max(ans, a[i] + x + mx);
	}
	return ans;
}
ll calcn(ll ansr, ll rx, ll rrx, int lp, int rp, int l, int r)
{
	ll ans = ansr;
	ll mx = rx;
	LoopR (i,r+1,rp) {
		ans = max(ans, a[i] - ps[i] + mx);
		mx = max(mx, a[i] + ps[i]);
	}
	LoopR (i,l,r+1) {
		ll x = min(-ps[i], -ps[r] + ps[i] - ps[l] + C);
		ans = max(ans, a[i] + x + mx);
	}
	ll x = min(0ll, C - (ps[r] - ps[l]));
	LoopR (i,lp,l)
		ans = max(ans, a[i] - ps[i] + mx + x);
	ans = max(ans, rrx + mx + x);
	return ans;
}
#endif
ll calc0(int l, int r)
{
	ll ans = calcin(l, r);
	ll mx = -1e18;
	Loop (i,0,l) {
		ans = max(ans, ps[i] + a[i] + mx);
		mx = max(mx, a[i] - ps[i]);
	}
	Loop (i,l,r+1) {
		ll x = min(ps[i], ps[r] - ps[i] + ps[l] + C);
		ans = max(ans, a[i] + x + mx);
	}
	return ans;
}
ll calcn(int l, int r)
{
	ll ans = 0;
	ll mx = -1e18;
	LoopR (i,r+1,n) {
		ans = max(ans, a[i] - ps[i] + mx);
		mx = max(mx, a[i] + ps[i]);
	}
	LoopR (i,l,r+1) {
		ll x = min(-ps[i], -ps[r] + ps[i] - ps[l] + C);
		ans = max(ans, a[i] + x + mx);
	}
	LoopR (i,0,l) {
		ll x = min(0ll, C - (ps[r] - ps[l]));
		ans = max(ans, a[i] - ps[i] + mx + x);
	}
	return ans;
}

ll solve(int l1, int r1, int l2, int r2)//, ll xl, ll xr, ll ansl, ll ansr)
{
	if (r1-l1 <= 0)
		return 1e18;
	int m = (l1+r1)/2;
	pll mn = {2e18, -1};
	r2 = min(r2, n);
	Loop (i,max(m+1,l2),r2) {
		ll x = calc0(m, i);//calc0(ansl, xl, l2, m, i);
		ll y = calcn(m, i);//calcn(ansr, xr, xl, l2, r2, m, i);
		mn = min(mn, pll{max(x, y), i});
	}
	ll ans = mn.first;
	//cerr << m << ": " << ans << " (" << l2 << ' ' << r2 << ")\n";
	int p = mn.second;
	ans = min(ans, solve(l1, m, l2, p+2));
	ans = min(ans, solve(m+1, r1, p-2, r2));
	return ans;
	//{
	//	int r22 = p+2;
	//	LoopR (i,r22,r2) {
	//		ansr = max(ansr, a[i] - ps[i] + xr);
	//		xr = max(xr, a[i] + ps[i]);
	//	}
	//	ans = min(ans, solve(l1, m, l2, r22, xl, xr, ansl, ansr));
	//}
	//{
	//	int l22 = p-2;
	//	Loop (i,l2,l22) {
	//		ansl = max(ansl, ps[i] + a[i] + xl);
	//		xl = max(xl, a[i] - ps[i]);
	//	}
	//	ans = min(ans, solve(m+1, r1, l22, r2, xl, xr, ansl, ansr));
	//}
	//return ans;
}


long long find_shortcut(int _n, std::vector<int> l, std::vector<int> d, int c)
{
	n = _n;
	Loop (i,1,n)
		ps[i] = ps[i-1] + l[i-1];
	Loop (i,0,n)
		a[i] = d[i];
	C = c;
	ll ans = solve(0, n-1, 0, n);//, 0, 0, 0, 0);
	return ans;
	//ll ans = 1e18;
	//int p0 = 0, p1 = 1;
	//while (p0 < n-1) {
	//	ll a = calc0(p0, p1);
	//	ll b = calcn(p0, p1);
	//	ans = min(ans, max(a, b));
	//	if (a <= b) {
	//		++p1;
	//	}
	//	if (a > b || p1 == n) {
	//		++p0;
	//		p1 -= 4;
	//	}
	//	while (p0 >= p1)
	//		++p1;
	//}
	//Loop (i,0,n-1) {
	//	int l = i+1, r = n-1;
	//	while (l < r) {
	//		int j = (l+r+1)/2;
	//		if (a <= b)
	//			l = j;
	//		else
	//			r = j-1;
	//	}
	//	ans = min(ans, max(calc0(i, l), calcn(i, l)));
	//	if (l < n-1)
	//		ans = min(ans, max(calc0(i, l+1), calcn(i, l+1)));
	//}
	return ans;
}

Compilation message

shortcut.cpp: In function 'll calcin(int, int)':
shortcut.cpp:52:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |   while (vecp < vec.size() && vec[vecp] <= i)
      |          ~~~~~^~~~~~~~~~~~
shortcut.cpp:55:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |    while (vecp < vec.size() && dis(i, mod(vec.back())) <= dis(i, mod(p)))
      |           ~~~~~^~~~~~~~~~~~
shortcut.cpp:60:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |   if (vecp < vec.size()) {
      |       ~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB n = 4, 80 is a correct answer
2 Correct 0 ms 212 KB n = 9, 110 is a correct answer
3 Correct 0 ms 212 KB n = 4, 21 is a correct answer
4 Correct 0 ms 212 KB n = 3, 4 is a correct answer
5 Correct 0 ms 212 KB n = 2, 62 is a correct answer
6 Correct 0 ms 212 KB n = 2, 3 is a correct answer
7 Correct 0 ms 212 KB n = 3, 29 is a correct answer
8 Correct 0 ms 212 KB n = 2, 3 is a correct answer
9 Correct 0 ms 212 KB n = 2, 3 is a correct answer
10 Correct 0 ms 212 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 212 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 212 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 212 KB n = 4, 3000000001 is a correct answer
15 Correct 0 ms 212 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 212 KB n = 5, 4000000000 is a correct answer
17 Correct 0 ms 212 KB n = 10, 1000000343 is a correct answer
18 Incorrect 0 ms 212 KB n = 10, incorrect answer: jury 3189 vs contestant 3392
19 Halted 0 ms 0 KB -