제출 #1362448

#제출 시각아이디문제언어결과실행 시간메모리
1362448ByeWorldDungeons Game (IOI21_dungeons)C++20
25 / 100
7094 ms182956 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "Ofast")
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<ll,ll> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 5e4+10;
const int MAXA = 5e4+10;
const int SQRT = 300;
const ll INF = 1e9;
const int MOD = 998244353;
const int LOG = 40;

ll n, s[MAXN], p[MAXN], w[MAXN], l[MAXN];
pii bin[MAXN][LOG+5][5];
ll up[MAXN];
vector<ll> vec;

void build(int k){
	for(int j=0; j<LOG; j++) bin[n+1][j][k] = {n+1, 0};

	for(int i=1; i<=n; i++){
		if(s[i] >= vec[k]) bin[i][0][k] = {l[i], p[i]};
		else bin[i][0][k] = {w[i], s[i]};
	}

	for(int j=1; j<LOG; j++){
		for(int i=1; i<=n; i++){
			ll nx = bin[i][j-1][k].fi, wei = bin[i][j-1][k].se;
			bin[i][j][k] = {bin[nx][j-1][k].fi, wei + bin[nx][j-1][k].se};
		}
	}
}
void init(int N, std::vector<int> S, std::vector<int> P, std::vector<int> W, std::vector<int> L) {
	n = N;
	set<ll> se;
	for(int i=1; i<=n; i++){
		s[i] = S[i-1], p[i] = P[i-1], w[i] = W[i-1]+1, l[i] = L[i-1]+1;
		se.insert(s[i]);
	}
	up[n+1] = 0;
	for(int i=n; i>=1; i--){
		up[i] = up[w[i]]+s[i];
	}

	for(auto in : se) vec.pb(in);
	for(int k=0; k<vec.size(); k++) build(k);
	return;
}

long long simulate(int x, int z) {
	ll idx = x+1, pow = z, ty = -1;

	for(int i=0; i<vec.size(); i++){
		if(pow < vec[i]){
			ty = i;
			break; // yg blm dicapai
		}
	}
	if(ty == -1){
		return pow + up[idx];
	}
	// cout << ty << " ty\n";

	for(int k=ty; k<vec.size(); k++){
		if(pow >= vec[k]) continue;

		for(int i=LOG-1; i>=0; i--){
			if(bin[idx][i][k].fi == n+1 || pow+bin[idx][i][k].se >= vec[k]) ;
			else {
				pow += bin[idx][i][k].se;
				idx = bin[idx][i][k].fi;
			}
		}

		pow += bin[idx][0][k].se;
		idx = bin[idx][0][k].fi;

		if(idx == n+1) return pow;
	}

	pow += up[idx];
	return pow;
}

#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…