Submission #1055979

#TimeUsernameProblemLanguageResultExecution timeMemory
1055979fuad27Dungeons Game (IOI21_dungeons)C++17
0 / 100
1657 ms1960340 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; const int N = 4e5+10; const int lg = 30; const int lgb = 6; const int base = 8; const long long inf = 2e18; int up[lg][N][lgb]; long long min_diff[lg][N][lgb]; long long sum[lg][N][lgb]; int n; vector<int> s, p, w, l; void init(int nn, std::vector<int> ss, std::vector<int> pp, std::vector<int> ww, std::vector<int> ll) { s=ss, p = pp, w = ww, l = ll; n = nn; for(int _ = 0;_<lg;_++) { for(int i = 0;i<=n;i++) { if(i == n) { up[_][i][0] = n; min_diff[_][i][0] = inf; sum[_][i][0] = 0; } else if(s[i] < (1ll<<_)) { up[_][i][0] = w[i]; min_diff[_][i][0] = inf; sum[_][i][0] = s[i]; } else { up[_][i][0] = l[i]; min_diff[_][i][0] = s[i]; sum[_][i][0] = p[i]; } } for(int l = 1;l<lgb;l++) { for(int i = 0;i<=n;i++) { int at = i; long long sm = 0; long long mn_diff = inf; for(int k = 0;k<base;k++) { if(min_diff[_][at][l-1] != inf) mn_diff = min(mn_diff, min_diff[_][at][l-1]-sm); sm+=sum[_][at][l-1]; at=up[_][at][l-1]; } up[_][i][l-1] = at; min_diff[_][i][l-1] = mn_diff; sum[_][i][l-1] = sm; } } } assert(n < (int)4e5); return; } long long simulate(int x, int zz) { long long z = zz; int cnt=0; while(1) { if(x == n)break; cnt++; assert(cnt<=100); int ll = min(lg-1, (int)__lg(z)); for(int j = lgb-1;j>=0;j--) { for(int _ = 1;_<base;_++) { if(up[ll][x][j] == n or min_diff[ll][x][j] <= z)continue; z += sum[ll][x][j]; x = up[ll][x][j]; } } if(s[x] <= z) { z+=s[x]; x=w[x]; } else if(s[x] > z) { z+=p[x]; x=l[x]; } } return 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...