Submission #1161362

#TimeUsernameProblemLanguageResultExecution timeMemory
1161362WansurDungeons Game (IOI21_dungeons)C++20
63 / 100
2883 ms543820 KiB
#include <bits/stdc++.h> #include "dungeons.h" #define ent '\n' using namespace std; typedef long long ll; const int maxn = 5e4 + 12; int s[maxn], p[maxn], w[maxn], l[maxn]; ll sum[24][24][maxn], mn[24][24][maxn]; int up[24][24][maxn]; int n; 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], p[i] = P[i]; w[i] = W[i], l[i] = L[i]; } for(int b = 1; b < 24; b++) { up[b][0][n] = n; mn[b][0][n] = -1e18; for(int i = 0; i < n; i++) { if(s[i] < (1 << b)) { up[b][0][i] = w[i]; mn[b][0][i] = 1e18; sum[b][0][i] = s[i]; } else { up[b][0][i] = l[i]; mn[b][0][i] = s[i]; sum[b][0][i] = p[i]; } } for(int k = 1; k < 24; k++) { for(int i = 0; i <= n; i++) { up[b][k][i] = up[b][k - 1][up[b][k - 1][i]]; mn[b][k][i] = min(mn[b][k - 1][i], mn[b][k - 1][up[b][k - 1][i]] - sum[b][k - 1][i]); sum[b][k][i] = sum[b][k - 1][i] + sum[b][k - 1][up[b][k - 1][i]]; } } } } ll simulate(int x, int val) { ll cur = val; while(x < n) { int b = 1; while(b + 1 < 24 && cur >= (1 << (b + 1)) - 1) { b++; } for(int k = 23; k >= 0; k--) { if(mn[b][k][x] > cur) { cur += sum[b][k][x]; x = up[b][k][x]; } } if(x == n) break; if(cur >= s[x]) { cur += s[x]; x = w[x]; } else { assert(0); cur += p[x]; x = l[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...