Submission #1057952

#TimeUsernameProblemLanguageResultExecution timeMemory
1057952shmaxOvertaking (IOI23_overtaking)C++17
65 / 100
3527 ms49488 KiB
#include "overtaking.h" #include <bits/stdc++.h> using namespace std; using i32 = int; #define int long long #define len(x) (int)x.size() #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define inf 1000'000'000'000'000'000LL template<typename T> using vec = vector<T>; template<typename T> using graph = vec<vec<T>>; namespace Params { int L, N; vec<int> T, W; int X, M; vec<int> S; } vec<vec<int>> e; vec<vec<pair<int, int>>> te; void init(i32 L, i32 N, std::vector<int> T, std::vector<i32> W, i32 X, i32 M, std::vector<i32> S) { Params::L = L; Params::N = N; Params::T = T; Params::W.resize(N); for (int i = 0; i < N; i++) { Params::W[i] = W[i]; } Params::X = X; Params::M = M; Params::S.resize(M); for (int i = 0; i < M; i++) { Params::S[i] = S[i]; } e.resize(N, vec<int>(M, 0)); te.resize(M); for (int i = 0; i < N; i++) { e[i][0] = T[i]; } for (int j = 1; j < M; j++) { vec<int> ord(N); iota(all(ord), 0); sort(all(ord), [&](int x, int y) { return e[x][j - 1] < e[y][j - 1]; }); int before = 0; int cur = 0; for (int k = 0; k < len(ord); k++) { int i = ord[k]; if (k != 0) { if (e[i][j - 1] != e[ord[k - 1]][j - 1]) { before = max(before, cur); cur = 0; } } e[i][j] = max(e[i][j - 1] + (Params::S[j] - Params::S[j - 1]) * Params::W[i], before); cur = max(cur, e[i][j]); } for (int i = 0; i < N; i++) { te[j - 1].emplace_back(e[i][j - 1], e[i][j]); } sort(all(te[j - 1])); for (int i = 1; i < N; i++) { te[j - 1][i].second = max(te[j - 1][i].second, te[j - 1][i - 1].second); } } } int arrival_time(int Y) { int cur_time = Y; for (int j = 1; j < Params::M; j++) { int time = 0; // for (int i = 0; i < Params::N; i++) { // if (e[i][j - 1] < cur_time) // time = max(time, e[i][j]); // } int tl = 0; int tr = len(te[j - 1]) - 1; while (tl != tr) { int tm = (tl + tr + 1) / 2; if (te[j - 1][tm].first < cur_time) { tl = tm; } else { tr = tm - 1; } } if (te[j - 1][tl].first < cur_time) { time = te[j - 1][tl].second; } time = max(time, cur_time + (Params::S[j] - Params::S[j - 1]) * Params::X); cur_time = time; } return cur_time; }
#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...