Submission #454665

#TimeUsernameProblemLanguageResultExecution timeMemory
454665ogibogi2004Dungeons Game (IOI21_dungeons)C++17
0 / 100
2 ms716 KiB
#include "dungeons.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
const int MAXN=4e5+6;
int g1[MAXN];
int g2[MAXN];
int dp1[MAXN][20];
int dp2[MAXN][20];
int p1[MAXN][20];
int p2[MAXN][20];
int strength[MAXN];
int points[MAXN];
void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l) {
	for(int i=0;i<n;i++)
	{
		points[i]=p[i];
		strength[i]=s[i];
		g1[i]=l[i];
		g2[i]=w[i];
		dp1[i][0]=g1[i];
		dp2[i][0]=g2[i];
		p1[i][0]=points[i];
		p2[i][0]=strength[i];
	}
	for(int step=1;step<20;++step)
	{
		for(int i=0;i<n;++i)
		{
			dp1[i][step]=dp1[dp1[i][step-1]][step-1];
			p1[i][step]=p1[i][step-1]+p1[dp1[i][step-1]][step-1];
			dp2[i][step]=dp2[dp2[i][step-1]][step-1];
			p2[i][step]=p2[i][step-1]+p2[dp2[i][step-1]][step-1];
		}
	}
	return;
}

long long simulate(int x, int z) {
	if(z>=strength[0])
	{
		for(int i=19;i>=0;i--)
		{
			if(dp2[x][i]!=0)
			{
				z+=p2[x][i];
				x=dp2[x][i];
			}
		}
		return z;
	}
	else
	{
		for(int i=19;i>=0;i--)
		{
			if(dp1[x][i]==0)continue;
			if(z+p1[x][i]<strength[0])
			{
				z+=p1[x][i];
				x=dp1[x][i];
			}
		}
		z+=points[x];
		x=g1[x];
		for(int i=19;i>=0;i--)
		{
			if(dp2[x][i]!=0)
			{
				z+=p2[x][i];
				x=dp2[x][i];
			}
		}
		return z;
	}
	return 0;
}

#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...