Submission #1241612

#TimeUsernameProblemLanguageResultExecution timeMemory
1241612Younis_DwaiDungeons Game (IOI21_dungeons)C++20
0 / 100
90 ms55624 KiB
#include "dungeons.h"
#include <vector>
#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N=4e5+5;
long long sz,S[N],P[N],W[N],L[N],Sum[N][26],nxt[N][26],mx[N][26],d[N],nxt2[N][26],Sum2[N][26];
long long Add(long long x , long long y){
     x+=y;
     if(x<=-1e17) x=-1e17;
     return x;
}
void init(int n, std::vector<int> s, std::vector<int> p, std::vector<int> w, std::vector<int> l){
    sz=n;
    for(int i=1;i<=n;i++){
        S[i]=s[i-1];
        P[i]=p[i-1];
        W[i]=w[i-1];
        L[i]=l[i-1];
        W[i]++;
        L[i]++;
    }
    S[n+1]=0;
    L[n+1]=W[n+1]=1;
    for(int j=0;j<=25;j++){
        nxt[n+1][j]=n+1;
        mx[n+1][j]=1e18;
        Sum[n+1][j]=0;
        nxt2[n+1][j]=n+1;
        Sum2[n+1][j]=-1e17;
    }
    for(int i=1;i<=n;i++){
        nxt[i][0]=W[i];
        Sum[i][0]=S[i];
        mx[i][0]=S[i];
        nxt2[i][0]=L[i];
        Sum2[i][0]=P[i];
    }
    for(int j=1;j<=25;j++){
        for(int i=1;i<=n+1;i++){
            nxt[i][j]=nxt[nxt[i][j-1]][j-1];
            Sum[i][j]=Add(Sum[i][j-1],Sum[nxt[i][j-1]][j-1]);
            mx[i][j]=max(mx[i][j-1],mx[nxt[i][j-1]][j-1]);
            Sum2[i][j]=Add(Sum2[i][j-1],Sum2[nxt2[i][j-1]][j-1]);
            nxt2[i][j]=nxt2[nxt2[i][j-1]][j-1];
        }
    }
    d[n+1]=0;
    for(int i=n;i>=1;i--){
        d[i]=1+d[W[i]];
    }
	return ;
}

long long simulate(int x, int z){
     ++x;
     long long power=z;
     if(power>=S[x]){
        //cout<<" $ $ $ "<<endl;
        for(int j=25;j>=0;j--){
            if((1<<j)>d[x]) continue ;
            power+=Sum[x][j];
            x=nxt[x][j];
            //cout<<" # "<<x<<' '<<j<<' '<<power<<endl;
        }

     }
     else{
        //cout<<" # # # "<<endl;
        for(int j=25;j>=0;j--){
            if(Sum2[x][j]<0 || power+Sum2[x][j]>=S[x]) continue ;
            power+=Sum2[x][j];
            x=nxt2[x][j];
        }

        power+=P[x];
        x=L[x];
        //cout<<" $ "<<x<<' '<<power<<endl;
        for(int j=25;j>=0;j--){
            if((1<<j)>d[x]) continue ;
            power+=Sum[x][j];
            x=nxt[x][j];
        }
     }
	 return power;
}

#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...