제출 #1067434

#제출 시각아이디문제언어결과실행 시간메모리
1067434Itamar던전 (IOI21_dungeons)C++17
63 / 100
2734 ms983088 KiB
#include <vector> using namespace std; #define vi vector<int> #define ll long long vi S,P,W,L; int N; const int siz = 5e4+2; #include<iostream> // tos + Z >= S[i] // assuming 2^k <= Z < 2^(k+1) in all jumps ll dp[siz][30][30]; // minumum of S[i]-tos ll tos[siz][30][30]; int wer[siz][30][30]; void init(int n, std::vector<int> s, std::vector<int> p, std::vector<int> w, std::vector<int> l) { S=s,P=p,W=w,L=l,N=n; for(int k = 0; k < 30; k++){ for(int i = 0; i < n; i++){ if(S[i] > (1<<k)){ wer[i][0][k] = l[i]; tos[i][0][k] = p[i]; dp[i][0][k] = S[i]; }else{ wer[i][0][k] = w[i]; tos[i][0][k] = S[i]; dp[i][0][k] = 1e18; } } for(int j = 1; j < 30; j++){ for(int i = 0; i < n; i++){ wer[i][j][k] = wer[wer[i][j-1][k]][j-1][k]; int ind = wer[i][j-1][k]; tos[i][j][k] = tos[i][j-1][k] + tos[ind][j-1][k]; dp[i][j][k] = min(dp[i][j-1][k], dp[ind][j-1][k]-tos[i][j-1][k]); } wer[n][j][k]=n; } } } long long simulate(int x, int z) { ll Z = z; int k = 0; while((1<<(k+1)) <= Z)k++; while(x<N){ for(int j = 29; j>=0; j--){ if(wer[x][j][k] < N && dp[x][j][k]>Z){ Z+= tos[x][j][k]; x = wer[x][j][k]; } } if(Z < S[x]){ Z += P[x]; x = L[x]; }else{ Z += S[x]; x = W[x]; } if(x==N)return Z; if(Z < S[x]){ Z += P[x]; x = L[x]; }else{ Z += S[x]; x = W[x]; } k++; } return Z; }
#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...