이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "dungeons.h"
#define INF LLONG_MAX
using namespace std;
typedef long long ll;
const int lg=25;
ll st[3][lg][lg][50001];
vector<int> S,P,W,L;
int N;
void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l) {
N=n;
S=s;
P=p;
W=w;
L=l;
for(int i=0;i<lg;i++){
for(int z=0;z<n;z++){
if(s[z]<(1<<i)){
st[0][i][0][z]=s[z];
if(w[z]!=n && s[w[z]]<(1<<i)){
st[1][i][0][z]=-INF;
}
else{
st[1][i][0][z]=s[z]-s[w[z]];
}
st[2][i][0][z]=w[z];
}
else{
st[0][i][0][z]=p[z];
if(l[z]!=n && s[l[z]]<(1<<i)){
st[1][i][0][z]=-INF;
}
else{
st[1][i][0][z]=p[z]-s[l[z]];
}
st[2][i][0][z]=l[z];
}
}
st[0][i][0][n]=0;
st[1][i][0][n]=0;
st[2][i][0][n]=n;
for(int j=1;j<lg;j++){
for(int z=0;z<n;z++){
int ind=st[2][i][j-1][z];
st[0][i][j][z]=st[0][i][j-1][z]+st[0][i][j-1][ind];
st[1][i][j][z]=st[1][i][j-1][z];
if(st[1][i][j-1][ind]!=-INF){
st[1][i][j][z]=max(st[1][i][j-1][z],st[1][i][j-1][ind]+st[0][i][j-1][z]);
}
st[2][i][j][z]=st[2][i][j-1][st[2][i][j-1][z]];
}
}
}
return;
}
long long simulate(int x, int z) {
ll res=z;
while(x!=N){
int h=0;
for(int i=0;i<res;i++){
if((res&(1<<i))){
h=i;
}
}
if(S[x]>=(1LL<<h) && res>=S[x]){
res+=S[x];
x=W[x];
}
else{
for(int i=lg-1;i>=0;i--){
if(st[1][h][i][x]<-res){
res+=st[0][h][i][x];
x=st[2][h][i][x];
}
}
res+=st[0][h][0][x];
x=st[2][h][0][x];
}
}
return res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |