#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn=5*1e4+5;
const int logg=30;
int n;
vector<int> s,p,w,l,h;
vector<long long> v;
long long sum[maxn][32];
int ver[maxn][32];
void construct(long long x)
{
for(int i=0; i<n; i++)
{
if(x>s[i])
{
ver[i][0]=w[i];
sum[i][0]=s[i];
}
else
{
ver[i][0]=l[i];
sum[i][0]=p[i];
}
}
ver[n][0]=n;
for(int j=1; j<=logg; j++)
for(int i=0; i<=n; i++)
{
sum[i][j]=sum[i][j-1]+sum[ver[i][j-1]][j-1];
if(1e18-sum[i][j-1]<sum[ver[i][j-1]][j-1])sum[i][j]=1e18;
ver[i][j]=ver[ver[i][j-1]][j-1];
//cout<<ver[i][j][num]<<" "<<i<<" "<<(1<<j)<<endl;
}
}
void init(int N, std::vector<int> S, std::vector<int> P, std::vector<int> W, std::vector<int> L)
{
n=N;
s=S;
p=P;
w=W;
l=L;
h=s;
sort(h.begin(),h.end());
v= {h[0]};
for(int i=1; i<h.size(); i++)
if(h[i]!=h[i-1])v.push_back(h[i]);
v.push_back(1e18+1);
return;
}
long long simulate(int x, int zz)
{
long long z=zz;
int num=0;
while(num<v.size())
{
if(x==n)return z;
while(num<v.size()&&z>=v[num])num++;
construct(v[num]);
//cout<<x<<" "<<z<<" "<<v[num]<<endl;
for(int j=logg; j>=0; j--)
{
if(z+sum[x][j]<v[num])
{
z+=sum[x][j];
x=ver[x][j];
}
}
if(x==n)
{
//cout<<"hey"<<endl;
return z;
}
z+=sum[x][0];
x=ver[x][0];
}
return z;
}
# | 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... |