제출 #1345002

#제출 시각아이디문제언어결과실행 시간메모리
1345002jellybean던전 (IOI21_dungeons)C++20
13 / 100
109 ms40208 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define dd(x) cout<<#x<<" is "<<x<<endl;
#define dd2(x,y) cout<<#x<<" is "<<x<<" "<<#y<<" is "<<y<<endl;
typedef pair<int,int> pii;

const int N = 50005;
int n;
vector<signed> s,p,w,l;

int lose[N][31]; //lose[i][k] = dungeon that is 2^k losses from i
int sum[N][31]; //sum[i][k] = total stregnth gained correspondingly
int lim[N][31]; //lim[i][k] = max strength limit
int win[N];

void twok(){
	for(int i=0; i<n; i++){
		lose[i][0] = l[i];
		sum[i][0] = p[i];
		lim[i][0] = s[i];
	}
	lose[n][0] = n;
	
	for(int k=1; k<30; k++){
		for(int i=0; i<=n; i++){
			int p = lose[i][k-1];
			lose[i][k] = lose[p][k-1];
			sum[i][k] = sum[i][k-1] + sum[p][k-1];
			lim[i][k] = min(lim[i][k-1], lim[p][k-1] - sum[i][k-1]);
		}
	}
}

void findnext(int &x, int &z){
	for(int k=30; k>=0; k--){
		if(lim[x][k] <= z) continue;
		z += sum[x][k];
		x = lose[x][k];
	}
}

void init(signed nn, vector<signed> S, vector<signed> P, vector<signed> W, vector<signed> L) {
	
	n = nn, s = S, p = P, w = W, l = L;
	twok();
	
	win[n] = 0;
	for(int i=n-1; i>=0; i--) win[i] = win[w[i]] + s[i];
	
	return;
}

long long simulate(signed X, signed Z) {
	int x = X, z = Z;
	
	findnext(x,z);
	return z + win[x];
	
}
#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...