Submission #609055

#TimeUsernameProblemLanguageResultExecution timeMemory
609055asdfasdfasdfasdfDungeons Game (IOI21_dungeons)C++17
100 / 100
2166 ms542828 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; #define MAX 444444 int N; vector<int> S,P,win,lose; vector<int> v[MAX]; const int INF=1e9; int Next[8][25][MAX]; int Sum[8][25][MAX]; int Value[8][25][MAX]; long long dp[MAX]; void init(int n,vector<int> s,vector<int> p,vector<int> w,vector<int> l) { tie(N,S,P,win,lose)=make_tuple(n,s,p,w,l); for(int i=n-1;i>=0;i--) dp[i]=dp[w[i]]+s[i]; for(int i=0;i<8;i++) { for(int j=0;j<n;j++) { int L=(1<<(3*i)); if(s[j]<L) { Next[i][0][j]=w[j]; Sum[i][0][j]=s[j]; Value[i][0][j]=INF; } else { Next[i][0][j]=l[j]; Sum[i][0][j]=p[j]; Value[i][0][j]=s[j]; } } Next[i][0][n]=n; Sum[i][0][n]=INF; Value[i][0][n]=INF; for(int j=1;j<3*i+3;j++) { for(int k=0;k<=n;k++) { Next[i][j][k]=Next[i][j-1][Next[i][j-1][k]]; Sum[i][j][k]=Sum[i][j-1][k]+Sum[i][j-1][Next[i][j-1][k]]; Sum[i][j][k]=min(Sum[i][j][k],INF); Value[i][j][k]=min(Value[i][j-1][k],Value[i][j-1][Next[i][j-1][k]]-Sum[i][j-1][k]); Value[i][j][k]=max(Value[i][j][k],0); } } } return; } long long simulate(int x, int z) { long long Z=z; for(int i=0;i<8;i++) { while(Z<(1<<(3*i+3))) { for(int j=3*i+2;j>=0;j--) { if(Next[i][j][x]!=N && Z+Sum[i][j][x]<(1<<(3*i+3)) && Value[i][j][x]>Z) { Z+=Sum[i][j][x]; x=Next[i][j][x]; } } if(x!=N && Z<(1<<(3*i+3)) && (S[x]>Z || S[x]<(1<<(2*i)))) { Z+=Sum[i][0][x]; x=Next[i][0][x]; } if(x==N) break; if(S[x]<=Z) { Z+=S[x]; x=win[x]; } if(x==N) break; } } return Z+dp[x]; }
#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...