제출 #1046536

#제출 시각아이디문제언어결과실행 시간메모리
1046536VMaksimoski008Dungeons Game (IOI21_dungeons)C++17
50 / 100
7059 ms268884 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const int maxn = 6e5 + 5; const int LOG = 25; vector<int> S, P, W, L; ll N, sub3 = 1, sub2 = 1, up[maxn][LOG]; ll sum[maxn][LOG], dist[maxn], mx[maxn][LOG]; void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l) { N = n; S = s; P = p; W = w; L = l; for(int i=1; i<N; i++) if(S[i] != S[i-1]) sub3 = 0; for(int i=0; i<N; i++) if(S[i] != P[i]) sub2 = 0; for(int i=N-1; i>=0; i--) dist[i] = dist[W[i]] + S[i]; if(sub3) { for(int i=0; i<N; i++) up[i][0] = L[i], sum[i][0] = P[i]; up[N][0] = N; for(int j=1; j<LOG; j++) for(int i=0; i<=N; i++) up[i][j] = up[up[i][j-1]][j-1]; for(int j=1; j<LOG; j++) for(int i=0; i<=N; i++) sum[i][j] = sum[i][j-1] + sum[up[i][j-1]][j-1]; } else { for(int i=0; i<N; i++) up[i][0] = W[i], sum[i][0] = mx[i][0] = S[i]; up[N][0] = N; for(int j=1; j<LOG; j++) for(int i=0; i<=N; i++) up[i][j] = up[up[i][j-1]][j-1]; for(int j=1; j<LOG; j++) for(int i=0; i<=N; i++) sum[i][j] = sum[i][j-1] + sum[up[i][j-1]][j-1]; for(int j=1; j<LOG; j++) for(int i=0; i<=N; i++) mx[i][j] = max(mx[i][j-1], mx[up[i][j-1]][j-1] - sum[i][j-1]); } return; } ll simulate(int x, int z) { //moze samo min(n, log 10^7) pati da izgubime (so sekoja zaguba, silata barem se duplira) //ako si na pozicija da gubis, simulacija //ako si na poz da pobedis, bin jumping if(sub2) { ll ans = z; while(true) { if(ans < S[x]) { ans += P[x]; x = L[x]; continue; } for(int j=LOG-1; j>=0; j--) { if(ans >= mx[x][j]) { ans += sum[x][j]; x = up[x][j]; } } if(x == N) return ans; } return ans; } if(sub3) { if(z >= S[x]) return (ll)z + dist[x]; ll ans = z; for(int i=LOG-1; i>=0; i--) { if(ans + sum[x][i] < S[x]) { ans += sum[x][i]; x = up[x][i]; } } if(x == N) return ans; if(ans < S[x]) ans += P[x], x = up[x][0]; return ans + dist[x]; } ll ans = z; while(x != N) { if(z >= S[x]) { z += S[x]; x = W[x]; } else { z += P[x]; x = L[x]; } } return z; }

컴파일 시 표준 에러 (stderr) 메시지

dungeons.cpp: In function 'll simulate(int, int)':
dungeons.cpp:87:8: warning: unused variable 'ans' [-Wunused-variable]
   87 |     ll ans = 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...