답안 #302477

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
302477 2020-09-18T17:46:21 Z JPN20 Shortcut (IOI16_shortcut) C++17
0 / 100
12 ms 16896 KB
#include "shortcut.h"
#include <bits/stdc++.h>
using namespace std;

class SparseTable {
	public:
	long long sz[1 << 20];
	long long dat[1 << 20][22];
	
	void init(vector<long long> Arr) {
		for (int i = 0; i < Arr.size(); i++) {
			for (int j = 0; j < 22; j++) dat[i][j] = 0;
		}
		for (int i = 0; i < (int)Arr.size(); i++) dat[i][0] = Arr[i];
		for (int i = 0; i < 20; i++) {
			for (int j = 0; j < (int)Arr.size(); j++) {
				if (j + (1 << i) >= (int)Arr.size()) continue;
				dat[j][i + 1] = max(dat[j][i], dat[j + (1 << i)][i]);
			}
		}
		for (int i = 0; i < 20; i++) {
			for (int j = (1 << i); j < (2 << i); j++) sz[j] = i;
		}
	}
	long long query(int l, int r) {
		if (l >= r) return -(1LL << 60);
		int len = r - l;
		int t = sz[len];
		return max(dat[l][t], dat[r - (1 << t)][t]);
	}
};

// Input
long long N, C;
long long X[1 << 20];
long long Y[1 << 20];
long long R1[1 << 20];
long long R2[1 << 20];

// SparseTable
SparseTable Z1;
SparseTable Z2;

vector<long long> calc(int l, int r) {
	long long val1 = 0;
	long long val2 = 0;
	long long val3 = 0;
	long long val4 = 0;
	long long TotalLen = X[r] - X[l] + C;
	
	// VAL1
	int pos1 = lower_bound(X + l, X + r + 1, X[l] + (TotalLen + 1LL) / 2LL) - X;
	long long c1 = Z2.query(0, l) + X[l];
	long long c2 = Z1.query(l, pos1) - X[l];
	long long c3 = Z2.query(pos1, r + 1) + X[r] + C;
	val1 = c1 + max(c2, c3);
	
	// VAL2
	int pos2 = lower_bound(X + l, X + r + 1, X[r] - TotalLen / 2LL) - X;
	long long d1 = Z1.query(r + 1, N) - X[r];
	long long d2 = Z2.query(pos2, r + 1) + X[r];
	long long d3 = Z1.query(l, pos2) - X[l] + C;
	val2 = d1 + max(d2, d3);
	
	// VAL3
	long long e1 = Z2.query(0, l + 1) + X[l];
	long long e2 = Z1.query(r, N) - X[r];
	val3 = e1 + e2 + min(C, X[r] - X[l]);
	
	// VAL4
	for (int i = l; i < pos1; i++) {
		int pos3 = lower_bound(X + l, X + r + 1, X[i] + (TotalLen + 1LL) / 2LL) - X;
		long long d1 = Z2.query(l, i) + X[i];
		long long d2 = Z1.query(i + 1, pos3) - X[i];
		long long d3 = Z2.query(pos3, r + 1) + X[r] + C + (X[i] - X[l]);
		val4 = max(val4, max({d1, d2, d3}) + Y[i]);
	}
	for (int i = pos1; i <= r; i++) {
		int pos3 = lower_bound(X + l, X + r + 1, X[i] - TotalLen / 2LL) - X;
		long long d1 = Z1.query(l, pos3) - X[l] + C + (X[r] - X[i]);
		long long d2 = Z2.query(pos3, i) + X[i];
		long long d3 = Z1.query(i + 1, r + 1) - X[i];
		val4 = max(val4, max({d1, d2, d3}) + Y[i]);
	}
	
	// GETVAL
	vector<long long> val = {val1, val2, val3, val4, R1[l], R2[r]};
	sort(val.begin(), val.end());
	reverse(val.begin(), val.end());
	return val;
}

vector<long long> solve(int L) {
	int cl = L + 1, cr = N, c1, c2;
	vector<long long> ret = {1LL << 60};
	for (int i = 0; i < 36; i++) {
		c1 = (cl + cl + cr) / 3;
		c2 = (cl + cr + cr) / 3;
		vector<long long> t1 = calc(L, c1);
		vector<long long> t2 = calc(L, c2);
		ret = min({ret, t1, t2});
		if (t1 < t2) { cr = c2; }
		else { cl = c1; }
	}
	for (int i = c1 - 5; i <= c1 + 5; i++) {
		if (i <= L || i >= N) continue;
		ret = min(ret, calc(L, i));
	}
	return ret;
}

long long find_shortcut(int n, vector<int> l, vector<int> d, int c) {
	// INPUT
	N = n; C = c;
	for (int i = 1; i < N; i++) X[i] = X[i - 1] + 1LL * l[i - 1];
	for (int i = 0; i < N; i++) Y[i] = d[i];
	
	// TABLE
	vector<long long> V1; for (int i = 0; i < N; i++) V1.push_back(Y[i] + X[i]);
	vector<long long> V2; for (int i = 0; i < N; i++) V2.push_back(Y[i] - X[i]);
	Z1.init(V1);
	Z2.init(V2);
	
	// PRECL
	for (int i = 0; i < N; i++) R1[i] = Y[i] + Z2.query(0, i) + X[i];
	for (int i = 0; i < N; i++) R2[i] = Y[i] + Z1.query(i + 1, N) - X[i];
	for (int i = 1; i < N; i++) R1[i] = max(R1[i], R1[i - 1]);
	for (int i = N - 2; i >= 0; i--) R2[i] = max(R2[i], R2[i + 1]);
	
	// TANSAKU
	long long FinalAns = (1LL << 60);
	for (int i = 0; i < N - 1; i++) {
		vector<long long> E = solve(i);
		FinalAns = min(FinalAns, E[0]);
	}
    return FinalAns;
}

Compilation message

shortcut.cpp: In member function 'void SparseTable::init(std::vector<long long int>)':
shortcut.cpp:11:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   11 |   for (int i = 0; i < Arr.size(); i++) {
      |                   ~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 16768 KB n = 4, 80 is a correct answer
2 Correct 10 ms 16768 KB n = 9, 110 is a correct answer
3 Correct 10 ms 16768 KB n = 4, 21 is a correct answer
4 Correct 10 ms 16768 KB n = 3, 4 is a correct answer
5 Correct 10 ms 16896 KB n = 2, 62 is a correct answer
6 Correct 11 ms 16768 KB n = 2, 3 is a correct answer
7 Correct 10 ms 16768 KB n = 3, 29 is a correct answer
8 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
9 Correct 10 ms 16768 KB n = 2, 3 is a correct answer
10 Correct 10 ms 16768 KB n = 2, 2000000001 is a correct answer
11 Correct 10 ms 16768 KB n = 2, 3000000000 is a correct answer
12 Correct 10 ms 16768 KB n = 3, 3000000000 is a correct answer
13 Correct 11 ms 16768 KB n = 3, 3000000000 is a correct answer
14 Correct 10 ms 16768 KB n = 4, 3000000001 is a correct answer
15 Correct 12 ms 16768 KB n = 4, 4000000000 is a correct answer
16 Correct 10 ms 16768 KB n = 5, 4000000000 is a correct answer
17 Correct 10 ms 16768 KB n = 10, 1000000343 is a correct answer
18 Correct 10 ms 16768 KB n = 10, 3189 is a correct answer
19 Correct 11 ms 16768 KB n = 10, 7000000000 is a correct answer
20 Correct 10 ms 16768 KB n = 5, 12 is a correct answer
21 Correct 10 ms 16768 KB n = 5, 25 is a correct answer
22 Correct 10 ms 16768 KB n = 2, 122 is a correct answer
23 Correct 10 ms 16768 KB n = 10, 117 is a correct answer
24 Correct 10 ms 16768 KB n = 10, 336 is a correct answer
25 Incorrect 10 ms 16768 KB n = 10, incorrect answer: jury 438 vs contestant 443
26 Halted 0 ms 0 KB -