제출 #1049959

#제출 시각아이디문제언어결과실행 시간메모리
1049959Alihan_8던전 (IOI21_dungeons)C++17
100 / 100
4638 ms1676368 KiB
#include "dungeons.h" #include <vector> #include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define ar array #define pb push_back #define ln '\n' //#define int long long using i64 = long long; template <class F, class _S> bool chmin(F &u, const _S &v){ bool flag = false; if ( u > v ){ u = v; flag |= true; } return flag; } template <class F, class _S> bool chmax(F &u, const _S &v){ bool flag = false; if ( u < v ){ u = v; flag |= true; } return flag; } const i64 inf = 1e15; const int L = 24; const int B = 125; vector <int> s, p, w, l; int n; struct Jump{ vector <vector<int>> U; vector <vector<i64>> S, need; int n, lim; Jump() {} void modify(vector <int> p, vector <int> w, int lim_){ n = p.size(); lim = lim_; S.resize(n + 1); U.resize(n + 1); need.resize(n + 1); for ( int i = 0; i <= n; i++ ){ S[i].resize(L); U[i].resize(L); need[i].resize(L); if ( i == n ) continue; S[i][0] = w[i]; U[i][0] = p[i]; need[i][0] = (s[i] >= lim ? s[i] : inf); } U[n][0] = n; S[n][0] = inf; for ( int i = 1; i < L; i++ ){ for ( int j = 0; j <= n; j++ ){ U[j][i] = U[U[j][i - 1]][i - 1]; S[j][i] = min(inf, S[j][i - 1] + S[U[j][i - 1]][i - 1]); need[j][i] = min(need[j][i - 1], need[U[j][i - 1]][i - 1] - S[j][i - 1]); } } } i64 simulate(int &u, i64 z, i64 rq){ for ( int i = L - 1; i >= 0; i-- ){ if ( U[u][i] == n ) continue; if ( rq == inf || (need[u][i] > z && z + S[u][i] < rq) ){ z += S[u][i]; u = U[u][i]; } } if ( u != n && z < rq ){ if ( s[u] <= z ){ z += s[u]; u = w[u]; } else{ z += p[u]; u = l[u]; } } return z; }; }; vector <Jump> A; vector <i64> v; void init(int n_, std::vector<int> s_, std::vector<int> p_, std::vector<int> w_, std::vector<int> l_) { n = n_, s = s_, p = p_, w = w_, l = l_; //~ for ( auto &u: s ) v.pb(u); v.pb(inf); v.pb(1); while ( v.back() <= 1e7 ){ v.pb(v.back() * B); } sort(all(v)); v.resize(unique(all(v)) - v.begin()); for ( auto &x: v ){ vector <int> fa(n), wh(n); for ( int i = 0; i < n; i++ ){ if ( s[i] < x ){ fa[i] = w[i]; wh[i] = s[i]; } else{ fa[i] = l[i]; wh[i] = p[i]; } } Jump h; h.modify(fa, wh, x); A.pb(h); } } long long simulate(int x, int Z) { // subtask #4 i64 z = Z; for ( int i = 0; i + 2 < (int)v.size(); i++ ){ while ( (z = A[i].simulate(x, z, v[i + 1])) < v[i + 1] && x != n ){ continue; } } z = A.back().simulate(x, z, inf); return z; }
#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...