Submission #1232681

#TimeUsernameProblemLanguageResultExecution timeMemory
1232681rythm_of_knightDungeons Game (IOI21_dungeons)C++17
50 / 100
7089 ms248580 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MXN = 4e5 + 45; int s[MXN], p[MXN], w[MXN], l[MXN], n; ll add[MXN], st[24][MXN][3]; void init(int N, vector<int> S, vector<int> P, vector<int> W, vector<int> L) { n = N; for (int i = 0; i < n; i++) s[i] = S[i], w[i] = W[i], p[i] = P[i], l[i] = L[i], add[i] = S[i]; for (int i = n - 1; i >= 0; i--) { ll cur = s[i] + s[i]; while (w[i] < n && s[w[i]] <= cur) { cur += add[w[i]]; add[i] += add[w[i]]; w[i] = w[w[i]]; } } for (int i = 0; i < n; i++) { st[0][i][0] = l[i]; st[0][i][1] = s[i] + p[i] - s[l[i]]; st[0][i][2] = max(0ll, st[0][i][1]); } for (int b = 1; b < 24; b++) { for (int i = 0; i < n; i++) { int h = st[b - 1][i][0]; st[b][i][0] = st[b - 1][h][0]; st[b][i][1] = st[b - 1][i][1] + st[b - 1][h][1]; st[b][i][2] = max(st[b - 1][i][2], st[b - 1][i][1] + st[b - 1][h][2]); } } } ll simulate(int x, int z) { ll cur = z; while (x < n) { if (s[x] > cur) { ll now = cur - s[x]; int b = 23; while (b >= 0) { if (b) { if (st[b - 1][x][2] + now < 0) { now += st[b - 1][x][1]; x = st[b - 1][x][0]; b++; } } else { now += st[b][x][1]; x = st[b][x][0]; } b--; } cur = s[x] + now; } else { cur += add[x]; x = w[x]; } } return cur; }
#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...