# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1056320 | Huseyn123 | Dungeons Game (IOI21_dungeons) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#include "dungeons.h"
#define INF LLONG_MAX
using namespace std;
typedef long long ll;
const int lgb=8;
const int lg=10;
ll st[3][lg][25][400001];
vector<int> S,P,W,L;
int N;
void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l) {
s.push_back(0);
N=n;
S=s;
P=p;
W=w;
L=l;
for(int i=0;i<lg;i++){
for(int z=0;z<n;z++){
if(s[z]<(1<<i)){
st[0][i][0][z]=s[z];
if(w[z]!=n && s[w[z]]<(1<<i)){
st[1][i][0][z]=-INF;
}
else{
st[1][i][0][z]=s[z]-s[w[z]];
}
st[2][i][0][z]=w[z];
}
else{
st[0][i][0][z]=p[z];
if(l[z]!=n && s[l[z]]<(1<<i)){
st[1][i][0][z]=-INF;
}
else{
st[1][i][0][z]=p[z]-s[l[z]];
}
st[2][i][0][z]=l[z];
}
}
st[0][i][0][n]=0;
st[1][i][0][n]=0;
st[2][i][0][n]=n;
for(int j=1;j<lg;j++){
for(int z=0;z<=n;z++){
st[0][i][j][z]=st[0][i][j-1][z];
st[1][i][j][z]=st[1][i][j-1][z];
st[2][i][j][z]=st[2][i][j-1][z];
for(int k=0;k<lgb-1;k++){
int ind=st[2][i][j][z];
if(st[1][i][j-1][ind]!=-INF){
st[1][i][j][z]=max(st[1][i][j][z],st[1][i][j-1][ind]+st[0][i][j][z]);
}
st[0][i][j][z]+=st[0][i][j-1][ind];
st[2][i][j][z]=st[2][i][j-1][ind];
}
}
}
}
return;
}
long long simulate(int x, int z) {
ll res=z;
while(x!=N){
int h=0;
for(int i=0;i<lg;i++){
if((res&(1<<i))){
h=i;
}
}
if(S[x]>=(1LL<<h) && res>=S[x]){
res+=S[x];
x=W[x];
}
else{
for(int i=lg-1;i>=0;i--){
for(int j=1;j<lgb;j++){
if(st[1][h][i][x]<-res){
res+=st[0][h][i][x];
x=st[2][h][i][x];
}
}
}
res+=st[0][h][0][x];
x=st[2][h][0][x];
}
}
return res;
}