Submission #1056416

#TimeUsernameProblemLanguageResultExecution timeMemory
1056416Huseyn123던전 (IOI21_dungeons)C++17
100 / 100
4993 ms1594932 KiB
#include <bits/stdc++.h> 
#include "dungeons.h"
#define INF LLONG_MAX
using namespace std;
typedef long long ll;
const int lgb=8;
const int lg=8;
ll st0[25][lg][400001];
ll st1[25][lg][400001];
int st2[25][lg][400001];
vector<int> S,P,W,L;
int N;
void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l) {
	s.push_back(0);
	N=n;
	S=s; 
	P=p; 
	W=w; 
	L=l;
	for(int i=0;i<25;i++){
		for(int z=0;z<n;z++){
			if(s[z]<(1<<i)){
				st0[i][0][z]=s[z];
				if(w[z]!=n && s[w[z]]<(1<<i)){
					st1[i][0][z]=-INF;
				}
				else{
					st1[i][0][z]=s[z]-s[w[z]];
				}
				st2[i][0][z]=w[z];
			}
			else{
				st0[i][0][z]=p[z];
				if(l[z]!=n && s[l[z]]<(1<<i)){
					st1[i][0][z]=-INF;
				}
				else{
					st1[i][0][z]=p[z]-s[l[z]];
				}
				st2[i][0][z]=l[z];
			}
		}
		st0[i][0][n]=0;
		st1[i][0][n]=0;
		st2[i][0][n]=n;
		for(int j=1;j<lg;j++){
			for(int z=0;z<=n;z++){
				st0[i][j][z]=st0[i][j-1][z];
				st1[i][j][z]=st1[i][j-1][z];
				st2[i][j][z]=st2[i][j-1][z];
				for(int k=0;k<lgb-1;k++){
					int ind=st2[i][j][z];
					if(st1[i][j-1][ind]!=-INF){
						st1[i][j][z]=max(st1[i][j][z],st1[i][j-1][ind]+st0[i][j][z]);
					}
					st0[i][j][z]+=st0[i][j-1][ind];
					st2[i][j][z]=st2[i][j-1][ind];
				}
			}
		}
	}
	return;
}
long long simulate(int x, int z) {
	ll res=z;
	while(x!=N){
		int h=0; 
		for(int i=0;i<25;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--){
				for(int j=1;j<lgb;j++){ 
					if(st1[h][i][x]<-res){
						res+=st0[h][i][x];
						x=st2[h][i][x];
					}
				}
			}
			res+=st0[h][0][x];
			x=st2[h][0][x];
		}
	}
	return res;
}

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