Submission #1197190

#TimeUsernameProblemLanguageResultExecution timeMemory
1197190LudisseyDungeons Game (IOI21_dungeons)C++20
100 / 100
5843 ms1931160 KiB
#include "dungeons.h" #include <bits/stdc++.h> #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() using namespace std; int N; vector<int> s,p,w,l; vector<int> ss; vector<vector<vector<pair<int,pair<int,int>>>>> nxt; /*vector<vector<vector<int>>> nxt; vector<vector<vector<int>>> nxp;*/ vector<long long> tw; const int LOG=22; const int MAXS=1e7; int sn; long long pth(int x){ if(x==N) return 0; if(tw[x]>=0) return tw[x]; tw[x]=pth(w[x])+(long long)s[x]; return tw[x]; } void init(signed n, std::vector<signed> S, std::vector<signed> P, std::vector<signed> W, std::vector<signed> L) { N=n; s.resize(N); tw.resize(N,-1); p.resize(N); w.resize(N+1); l.resize(N+1); l[N]=N; w[N]=N; for (int i = 0; i < n; i++) { s[i]=S[i]; p[i]=P[i]; w[i]=W[i]; l[i]=L[i]; } ss.push_back(0); int u=1; ss.push_back(u); while(u<MAXS){ u*=6; ss.push_back(u); } sn=sz(ss); nxt.resize(N+1,vector<vector<pair<int,pair<int,int>>>>(sn,vector<pair<int,pair<int,int>>>(1,{0,{0,0}}))); for (int j = 0; j < sz(ss); j++){ nxt[N][j][0].first=0; nxt[N][j][0].second.first=N; nxt[N][j][0].second.second=1e8; } for (int i = 0; i < n; i++){ for (int j = 0; j < sz(ss); j++) { if(s[i]<=ss[j]){ nxt[i][j][0].first=s[i]; nxt[i][j][0].second.first=w[i]; nxt[i][j][0].second.second=1e8; }else{ nxt[i][j][0].first=p[i]; nxt[i][j][0].second.first=l[i]; nxt[i][j][0].second.second=s[i]; } } } for (int j = 1; j < LOG; j++) { for (int i = 0; i <= N; i++) { for (int k = 0; k < sz(ss); k++){ if(j>sz(nxt[i][k])||nxt[i][k][j-1].second.first==N||j>sz(nxt[nxt[i][k][j-1].second.first][k])||nxt[i][k][j-1].second.second<=ss[k]||nxt[nxt[i][k][j-1].second.first][k][j-1].second.second-nxt[i][k][j-1].first<=ss[k]) continue; nxt[i][k].push_back({nxt[i][k][j-1].first+nxt[nxt[i][k][j-1].second.first][k][j-1].first,{nxt[nxt[i][k][j-1].second.first][k][j-1].second.first,min(nxt[i][k][j-1].second.second,nxt[nxt[i][k][j-1].second.first][k][j-1].second.second-nxt[i][k][j-1].first)}}); } } } return; } int cs,u; long long simulate(signed x, signed z) { cs=z; u=x; for (int i = 0; i < sz(ss); i++) { while(ss[i+1]>cs){ for (int j = LOG-1; j >= 0; j--) { if(j>=sz(nxt[u][i])||nxt[u][i][j].second.first==N||nxt[u][i][j].second.second<=cs) continue; cs+=nxt[u][i][j].first; u=nxt[u][i][j].second.first; } if(nxt[u][i][0].second.first==N){ if(s[u]>cs) cs+=p[u]; else cs+=s[u]; return cs; }else{ if(s[u]>cs) { cs+=p[u]; u=l[u]; } else { cs+=s[u]; u=w[u]; } } if(u==N) return cs; } } return (long long)cs+pth(u); }
#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...