제출 #1232723

#제출 시각아이디문제언어결과실행 시간메모리
1232723rythm_of_knight던전 (IOI21_dungeons)C++17
50 / 100
249 ms284464 KiB
#include "dungeons.h" #include <bits/stdc++.h> #define ar array using namespace std; typedef long long ll; const int MXN = 4e5 + 45, MXA = 1e7 + 7; int s[MXN], w[MXN], hlg[MXA], n; ll add[MXN]; ar <ll, 3> st[24][MXN]; int nok = 0; 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], 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++) { int cur = i, cnt = 0; while (cur < n && cnt < 30) { cnt++; cur = w[cur]; } if (cnt == 30) nok = 1; } for (int i = 2; i < MXA; i++) hlg[i] = hlg[i >> 1] + 1; 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) { // if (nok) // return -1; ll cur = z; int cnt = 0; while (x < n) { if (s[x] > cur) { ll now = cur - s[x]; int b = min(23, hlg[s[x] - cur]); while (b >= 0) { // cnt++; auto &tmp = st[b][x]; if (tmp[2] + now < 0) { now += tmp[1]; x = tmp[0]; } b--; } now += st[0][x][1]; x = st[0][x][0]; cur = s[x] + now; } else { cnt++; cur += add[x]; x = w[x]; } } if (cnt >= 30) return -1; 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...