Submission #1048483

#TimeUsernameProblemLanguageResultExecution timeMemory
1048483DorostWefDungeons Game (IOI21_dungeons)C++17
24 / 100
7067 ms255232 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define F first #define S second #define mk make_pair typedef pair <ll, ll> pii; const int N = 400023, LG = 24; int s[N], p[N], w[N], l[N], n; long long m[N], a[N]; pair <int, pii> nx[N][LG]; void init(int nn, std::vector<int> ss, std::vector<int> pp, std::vector<int> ww, std::vector<int> ll) { n = nn; for (int i = 0; i < n; i++) { s[i] = ss[i]; p[i] = pp[i]; w[i] = ww[i]; l[i] = ll[i]; } m[n] = 0; a[n] = 0; l[n] = n; w[n] = n; for (int i = n - 1; i >= 0; i--) { a[i] = a[w[i]] + s[i]; m[i] = max((long long)s[i], m[w[i]] - s[i]); } for (int i = 0; i <= n; i++) { nx[i][0].F = l[i]; nx[i][0].S.F = s[i] - 1; nx[i][0].S.S = p[i]; } for (int j = 1; j < LG; j++) { for (int i = 0; i <= n; i++) { int w = nx[i][j - 1].F; nx[i][j].F = nx[w][j - 1].F; nx[i][j].S.S = nx[i][j - 1].S.S + nx[w][j - 1].S.S; nx[i][j].S.F = min (nx[i][j - 1].S.F, nx[w][j - 1].S.F - nx[i][j - 1].S.S); } } return; } pair <int, long long> find (int x, ll z) { for (int i = LG - 1; i >= 0; i--) { if (z <= nx[x][i].S.F) { z += nx[x][i].S.S; x = nx[x][i].F; } } return {x, z}; } ll ans (int x, ll z) { if (z >= m[x]) return z + a[x]; if (z >= s[x]) { z += s[x]; x = w[x]; } else { pair <int, int> p = find (x, z); z = p.S; x = p.F; } return ans (x, z); } long long simulate(int x, int z) { return ans (x, 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...