Submission #1047913

#TimeUsernameProblemLanguageResultExecution timeMemory
1047913qilbyOvertaking (IOI23_overtaking)C++17
100 / 100
358 ms59332 KiB
#include <bits/stdc++.h> #include "overtaking.h" using namespace std; using ll = long long; const int N = 1009; ll n, m, x, w[N], s[N], t[N][N], f[N][N]; void init(int L, int N1, vector < ll > T, vector < int > W, int X, int M, vector < int > S) { n = N1, m = M, x = X; vector < ll > nw, nt; for (int i = 0; i < n; i++) if (W[i] > x) { nw.push_back(W[i]); nt.push_back(T[i]); } n = (int)nt.size(); for (int i = 0; i < n; i++) T[i] = nt[i], w[i] = nw[i]; for (int i = 0; i < m; i++) s[i] = S[i]; for (int i = 0; i < n; i++) t[0][i] = T[i]; for (int i = 1; i < m; i++) { ll d = s[i] - s[i - 1]; vector < vector < ll > > vec; for (int j = 0; j < n; j++) vec.push_back({t[i - 1][j], t[i - 1][j] + w[j] * d, j}); sort(vec.begin(), vec.end()); ll j = 0, mx = 0; while (j < n) { int l = j; while (l + 1 < n && vec[l][0] == vec[l + 1][0]) l++; for (int p = j; p <= l; p++) t[i][vec[p][2]] = max(mx, t[i - 1][vec[p][2]] + w[vec[p][2]] * d); while (j <= l) { mx = max(mx, vec[j][1]); j++; } } } for (int i = 0; i < m; i++) sort(t[i], t[i] + n); for (int i = 0; i < n; i++) f[m - 1][i] = t[m - 1][i]; for (int i = m - 2; i >= 0; i--) { f[i][0] = t[i][0] + x * (s[m - 1] - s[i]); for (int j = 1; j < n; j++) { int l = i + 1, r = m - 1; while (l < r) { int mid = (l + r) >> 1; if (t[i][j] + x * (s[mid] - s[i]) <= t[mid][j - 1]) r = mid; else l = mid + 1; } int pt = j - 1; while (pt > 0 && t[l][pt - 1] == t[l][pt]) pt--; if (t[i][j] + x * (s[l] - s[i]) <= t[l][j - 1]) f[i][j] = f[l][pt]; else f[i][j] = t[i][j] + x * (s[m - 1] - s[i]); } } } ll arrival_time(ll y) { if (y <= t[0][0]) return y + x * s[m - 1]; int l = 0, r = n - 1; while (l < r) { int mid = (l + r + 1) >> 1; if (t[0][mid] < y) l = mid; else r = mid - 1; } int lg = 1, rg = m - 1; while (lg < rg) { int mid = (lg + rg) >> 1; if (y + x * s[mid] <= t[mid][l]) rg = mid; else lg = mid + 1; } while (l > 0 && t[lg][l - 1] == t[lg][l]) l--; if (y + x * s[lg] <= t[lg][l]) return f[lg][l]; return y + x * s[m - 1]; } /*int main() { //ios_base::sync_with_stdio(0); cin.tie(0); ifstream cin("3-21.in"); ifstream fin("3-21.out"); int l, q; cin >> l >> n >> x >> m >> q; vector < ll > T(n); vector < int > W(n), S(m); for (int i = 0; i < n; i++) cin >> T[i]; for (int i = 0; i < n; i++) cin >> W[i]; for (int i = 0; i < m; i++) cin >> S[i]; init(l, n, T, W, x, m, S); for (int it = 1; it <= q; it++) { ll y; cin >> y; ll crr = arrival_time(y, (it == 65 || it == 75)); ll c; fin >> c; if (c != crr) cout << "bad! " << it << " " << crr << " " << c << "\n"; } }*/
#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...