제출 #645172

#제출 시각아이디문제언어결과실행 시간메모리
645172jamezzz던전 (IOI21_dungeons)C++17
89 / 100
7052 ms592100 KiB
#include "dungeons.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define maxn 400001 #define lgn 8 #define base 8 #define INF 1023456789123456789 int n,to[maxn][lgn][lgn+1]; ll gain[maxn][lgn][lgn+1],mn[maxn][lgn][lgn+1],pwr[lgn+2]; vector<int> s,w; void init(int _n,vector<int> _s,vector<int> p,vector<int> _w,vector<int> l){ pwr[0]=1; for(int i=1;i<=lgn+1;++i)pwr[i]=pwr[i-1]*base; n=_n;s=_s;w=_w; for(int k=0;k<=lgn;++k){//win if <base^k, lose if >=base^k for(int i=0;i<n;++i){ to[i][0][k]=(s[i]<pwr[k])?w[i]:l[i]; gain[i][0][k]=(s[i]<pwr[k])?s[i]:p[i]; mn[i][0][k]=(s[i]<pwr[k])?INF:s[i]; } to[n][0][k]=n; gain[n][0][k]=0; mn[n][0][k]=INF; for(int j=1;j<lgn;++j){ for(int i=0;i<=n;++i){ int cur=i; mn[i][j][k]=INF; for(int b=0;b<base;++b){ to[i][j][k]=to[cur][j-1][k]; mn[i][j][k]=min(mn[i][j][k],mn[cur][j-1][k]-gain[i][j][k]); gain[i][j][k]+=gain[cur][j-1][k]; cur=to[cur][j-1][k]; } } } } } ll simulate(int x,int z){ ll str=z; int pos=x; while(pos!=n){ int k=0; while(pwr[k+1]<=str)++k; if(k>lgn){ int cur=pos; for(int b=0;b<base-1;++b){ str+=gain[cur][lgn-1][lgn]; cur=to[pos][lgn-1][lgn]; } return str; } for(int j=lgn-1;j>=0;--j){ for(int b=0;b<base-1;++b){ if(str<mn[pos][j][k]){ str+=gain[pos][j][k]; pos=to[pos][j][k]; } } } if(pos!=n){ str+=s[pos]; pos=w[pos]; } } return str; }
#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...