제출 #1049580

#제출 시각아이디문제언어결과실행 시간메모리
1049580vjudge1던전 (IOI21_dungeons)C++17
0 / 100
7075 ms180308 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
struct level {
	private:
	int bj[400100][25],mx[400100][25];
	long long inc[400100][25];
	public:
	long long strength(int n,int k){
		return inc[n][k];
	}
	int strongest(int n,int k){
		return mx[n][k];
	}
	int dungeon(int n,int k){
		return bj[n][k];
	}
	void setdungeon(int n,int go,int add){
		inc[n][0]=add;
		bj[n][0]=go;
		mx[n][0]=add;
	}
	void preproc(int n){
		for(int j=1;j<25;j++)
			for(int i=0;i<=n;i++)
				bj[i][j]=bj[bj[i][j-1]][j-1],
				inc[i][j]=inc[i][j-1]+inc[bj[i][j-1]][j-1],
				mx[i][j]=max(mx[i][j-1],mx[bj[i][j-1]][j-1]);
	}
} sus;
int l[400100];
void init(int n,vector<int> s,vector<int> p,vector<int> w,vector<int> L) {
	for(int i=0;i<n;i++) l[i]=L[i],
		sus.setdungeon(i,w[i],p[i]);
	sus.setdungeon(n,n,0),
	sus.preproc(n);
}

long long simulate(int x, int Z) {
	long long z=Z;
	while(1){
		if(sus.strongest(x,24)<=Z)
			return z+sus.strength(x,24);
		long long add=0;
		for(int i=24;i--;)
			if(sus.strongest(x,i)<=Z)
				add+=sus.strength(x,i),
				x=sus.dungeon(x,i);
		z+=add;
		int K=sus.strength(x,0);
		if(z>=sus.strongest(x,0))
			x=sus.dungeon(x,0);
		else x=l[x];
		z+=K;
	}
}

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