제출 #1237470

#제출 시각아이디문제언어결과실행 시간메모리
1237470Hamed_Ghaffari던전 (IOI21_dungeons)C++20
63 / 100
1885 ms388152 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MXN = 5e4 + 10, LOG = 25, inf = 1e7; int t, n, s[MXN], p[MXN], w[MXN], l[MXN]; ll dp[MXN]; struct node { int f, sum, mn; node(): f(0), sum(0), mn(0) {} } par[LOG][LOG][MXN]; void init(int _n, vector<int> _s, vector<int> _p, vector<int> _w, vector<int> _l) { n = _n; for(int i=1; i<=n; i++) s[i] = _s[i-1], p[i] = _p[i-1], w[i] = _w[i-1] + 1, l[i] = _l[i-1] + 1; w[n + 1] = n + 1; l[n + 1] = n + 1; for(int i=n; i>=1; i--) dp[i] = dp[w[i]] + s[i]; for(int i=1; i<=n+1; i++) for(int j=0; j<LOG; j++) if(s[i] < (1<<j)) { par[0][j][i].f = w[i]; par[0][j][i].mn = inf; par[0][j][i].sum = s[i]; } else { par[0][j][i].f = l[i]; par[0][j][i].mn = s[i] - 1; par[0][j][i].sum = p[i]; } for(int i=1; i<LOG; i++) for(int j=0; j<LOG; j++) for(int k=1; k<=n+1; k++) { par[i][j][k].f = par[i-1][j][par[i-1][j][k].f].f; par[i][j][k].mn = min(par[i-1][j][k].mn, par[i-1][j][par[i-1][j][k].f].mn - par[i-1][j][k].sum); par[i][j][k].sum = par[i-1][j][k].sum + par[i-1][j][par[i-1][j][k].f].sum; } } ll simulate(int x, int z) { x++; while(x <= n && z <= 64) { if(z>=s[x]) { z += s[x]; x = w[x]; } else { z += p[x]; x = l[x]; } } while(x <= n) { int t = min(__lg(z), LOG - 1); for(int i=t; i>=0; i--) { if(z <= par[i][t][x].mn) { z += par[i][t][x].sum; x = par[i][t][x].f; } } if(z>=s[x]) { z += s[x]; x = w[x]; } else { z += p[x]; x = l[x]; } if(z >= inf) return (ll)dp[x] + z; } 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...