Submission #1203367

#TimeUsernameProblemLanguageResultExecution timeMemory
1203367HappyCapybaraDungeons Game (IOI21_dungeons)C++17
62 / 100
7080 ms999872 KiB
#include "dungeons.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long

int n;
vector<int> p, l;
vector<vector<vector<ll>>> j2;
vector<vector<vector<pair<int,ll>>>> j;
set<int> ssl;
vector<int> sl;

void init(int n, vector<int> s, vector<int> p, vector<int> w, vector<int> l){
	::n = n;
	ssl.insert(0);
	for (int i=0; i<n; i++) ssl.insert(s[i]);
    if (ssl.size() <= 6){
        for (int x : ssl) sl.push_back(x);
	    sort(sl.begin(), sl.end());
	    j.assign(sl.size(), vector<vector<pair<int,ll>>>(n+1, vector<pair<int,ll>>(20)));
	    for (int x=0; x<sl.size(); x++){
            j[x][n][0] = {n, 0};
            for (int i=0; i<n; i++){
                if (sl[x] >= s[i]) j[x][i][0] = {w[i], s[i]};
                else j[x][i][0] = {l[i], p[i]};
            }
        }
	    for (int x=0; x<sl.size(); x++){
            for (int k=1; k<20; k++){
                for (int i=0; i<=n; i++) j[x][i][k] = {j[x][j[x][i][k-1].first][k-1].first, j[x][i][k-1].second+j[x][j[x][i][k-1].first][k-1].second};
            }
        }
	    return;
    }
    ::p = p;
	::l = l;
	j2.assign(n+1, vector<vector<ll>>(20, vector<ll>(3)));
	j2[n][0] = {n, 0, 0};
	for (int i=0; i<n; i++) j2[i][0] = {w[i], s[i], s[i]};
	for (int k=1; k<20; k++){
		for (int i=0; i<=n; i++) j2[i][k] = {j2[j2[i][k-1][0]][k-1][0], j2[i][k-1][1]+j2[j2[i][k-1][0]][k-1][1], max(j2[i][k-1][2], j2[j2[i][k-1][0]][k-1][2]-j2[i][k-1][1])};
	}
	return;
}

ll simulate(int x, int iz){
	ll z = iz;
    if (ssl.size() > 6){
        while (x != n){
            for (int k=19; k>=0; k--){
                if (z >= j2[x][k][2]){
                    z += j2[x][k][1];
                    x = j2[x][k][0];
                }
            }
            if (x != n){
                z += p[x];
                x = l[x];
            }
        }
        return z;
    }
    int y;
    for (int i=0; i<sl.size(); i++){
        if (z >= sl[i]) y = i;
    }
	while (x != n){
		for (int k=19; k>=0; k--){
			if (y+1 == sl.size() || z+j[y][x][k].second < sl[y+1]){
				z += j[y][x][k].second;
				x = j[y][x][k].first;
			}
		}
		z += j[y][x][0].second;
		x = j[y][x][0].first;
        for (int i=0; i<sl.size(); i++){
            if (z >= sl[i]) y = i;
        }
	}
	return z;
}
#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...