Submission #302489

#TimeUsernameProblemLanguageResultExecution timeMemory
302489JPN20Shortcut (IOI16_shortcut)C++17
0 / 100
10 ms16896 KiB
#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; long long calc(int l, int r) { long long val1 = 0; long long val2 = 0; long long val3 = 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]); // GETVAL return max({val1, val2, val3, R1[l], R2[r]}); } long long calc2(int l, int r) { long long val4 = 0; long long TotalLen = X[r] - X[l] + C; int pos1 = lower_bound(X + l, X + r + 1, X[l] + (TotalLen + 1LL) / 2LL) - X; 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]); } return val4; } long long solve(int L) { int cl = L + 1, cr = N, cm; long long ret = (1LL << 60); for (int i = 0; i < 36; i++) { cm = (cl + cr) / 2; long long t1 = calc(L, cm); long long t2 = calc2(L, cm); ret = min(ret, max(t1, t2)); if (t1 < t2) { cr = cm; } else { cl = cm; } } for (int i = cm - 1; i <= cm + 1; i++) { if (i <= L || i >= N) continue; ret = min(ret, max(calc(L, i), calc2(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++) { long long E = solve(i); FinalAns = min(FinalAns, E); } return FinalAns; }

Compilation message (stderr)

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++) {
      |                   ~~^~~~~~~~~~~~
#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...