Submission #1271316

#TimeUsernameProblemLanguageResultExecution timeMemory
1271316nerrrminDungeons Game (IOI21_dungeons)C++20
0 / 100
1 ms840 KiB
#include "dungeons.h"
#include <bits/stdc++.h>
#include <vector>
using namespace std;
const int maxn = 4e5 + 10;
int nn;
vector < long long > a, b;
vector < long long > win, lose;
long long req, jump[maxn][30], collect[maxn][30];
void init(int n, std::vector<int> s, std::vector<int> p, std::vector<int> w, std::vector<int> l) {
    nn = n;
    a.resize(n, 0);
    b.resize(n, 0);
    req = s[0];
    for (int i = 0; i < nn; ++ i)
        a[i] = s[i];
    for (int i = 0; i < nn; ++ i)
        b[i] = p[i];
    win.resize(n, 0);
    lose.resize(n, 0);
    for (int i = 0; i < nn; ++ i)
        win[i] = w[i];
    for (int i = 0; i < nn; ++ i)
        lose[i] = l[i];
    for (int j = 0; j < 30; ++ j)
    {
        jump[n][j] = n;
    }
    for (int i = 0; i < n; ++ i)
    {
        jump[i][0] = lose[i];
        collect[i][0] = b[i];
    }
	for (int j = 1; j < 30; ++ j)
    {
        for (int i = 0; i < n; ++ i)
        {
            jump[i][j] = jump[jump[i][j-1]][j-1];
            collect[i][j] = collect[i][j-1] + collect[jump[i][j-1]][j-1];
        }
    }
}
bool check(long long start, long long s, long long x)
{
    long long pos = start, power = s;
    for (int i = 29; i >= 0; -- i)
    {
        if((1 << i) & x)
        {
            power += collect[pos][i];
            pos = jump[pos][i];
            if(pos == nn)return 1;

            if(power >= req)return 1;
        }
    }
    return (power >= req);
}
long long rec(long long pos, long long s)
{
    if(pos == nn)return s;
    if(s >= a[pos])return rec(win[pos], s+a[pos]);
    else return rec(lose[pos], s+b[pos]);
}
long long simulate(int x, int z)
{
    long long lt = 0, rt = 1e7, mid, ans = 1e7+1;
    while(lt <= rt)
    {
        mid = (lt + rt)/2;
        if(check(x, z, mid))
        {
            rt = mid - 1;
            ans = mid;
        }
        else lt = mid + 1;
    }
    assert(ans < 1e7+1);
    long long pos = x, power = z;
    for (int bit = 0; bit < 30; ++ bit)
    {
        if((1 << bit) & ans)
        {
            assert(pos != nn);
            pos = jump[pos][bit];

            power += collect[pos][bit];
        }
    }

	return rec(pos, power);
}

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