Submission #650046

# Submission time Handle Problem Language Result Execution time Memory
650046 2022-10-12T06:58:33 Z phathnv Rainforest Jumps (APIO21_jumps) C++11
4 / 100
1507 ms 63700 KB
#include <bits/stdc++.h>

using namespace std;

const int LOGN = 18;

int n;
vector<int> h;
vector<vector<int>> l, r, best;

void init(int _n, vector<int> _h) {
    n = _n;
    h = _h;

    l.assign(n, vector<int>(LOGN, 0));
    r.assign(n, vector<int>(LOGN, 0));
    best.assign(n, vector<int>(LOGN, 0));

    l[0][0] = -1;
    for (int i = 1; i < n; ++i) {
        l[i][0] = i - 1;
        while (l[i][0] != -1 && h[i] > h[l[i][0]]) {
            l[i][0] = l[l[i][0]][0];
        }
    }
    r[n - 1][0] = -1;
    for (int i = n - 2; i >= 0; --i) {
        r[i][0] = i + 1;
        while (r[i][0] != -1 && h[i] > h[r[i][0]]) {
            r[i][0] = r[r[i][0]][0];
        }
    }
    for (int i = 0; i < n; ++i) {
        if (l[i][0] == -1 || r[i][0] == -1) {
            best[i][0] = max(l[i][0], r[i][0]);
        } else if (h[l[i][0]] > h[r[i][0]]) {
            best[i][0] = l[i][0];
        } else {
            best[i][0] = r[i][0];
        }
    }

    for (int i = 0; i < n; ++i) {
        for (int j = 1; j < LOGN; ++j) {
            l[i][j] = (l[i][j - 1] == -1? -1 : l[l[i][j - 1]][j - 1]);
        }
    }
    for (int i = n - 1; i >= 0; --i) {
        for (int j = 1; j < LOGN; ++j) {
            r[i][j] = (r[i][j - 1] == -1? -1 : r[r[i][j - 1]][j - 1]);
        }
    }
    for (int j = 1; j < LOGN; ++j) {
        for (int i = 0; i < n; ++i) {
            best[i][j] = (best[i][j - 1] == -1? -1 : best[best[i][j - 1]][j - 1]);
        }
    }
}

int getMax(int u, int v) {
    if (u > v) {
        return 0;
    }
    int p = u;
    for (int i = LOGN - 1; i >= 0; --i) {
        if (r[p][i] != -1 && r[p][i] <= v) {
            p = r[p][i];
        }
    }
    return h[p];
}

int minimum_jumps(int a, int b, int c, int d) {
    int maxR = getMax(c, d);
    int maxC = getMax(b + 1, c - 1);

    int s = b;

    // find optimal s
    for (int i = LOGN - 1; i >= 0; --i) {
        if (l[s][i] != -1 && l[s][i] >= a && h[l[s][i]] < maxR) {
            s = l[s][i];
        }
    }

    int res = 0;
    for (int i = LOGN - 1; i >= 0; --i) {
        if (best[s][i] != -1 && h[best[s][i]] < maxC) {
            res += (1 << i);
            s = best[s][i];
        }
    }

    // l-r
    if (l[s][0] != -1 && c <= r[l[s][0]][0] && r[l[s][0]][0] <= d) {
        return res + 2;
    }

    // r-r-r...
    for (int i = LOGN - 1; i >= 0; --i) {
        if (r[s][i] != -1 && h[r[s][i]] <= maxC) {
            res += (1 << i);
            s = r[s][i];
        }
    }
    if (c <= r[s][0] && r[s][0] <= d) {
        return res + 1;
    }

    return -1;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 237 ms 50744 KB Output is correct
4 Correct 1127 ms 63688 KB Output is correct
5 Correct 1129 ms 32200 KB Output is correct
6 Correct 1298 ms 63700 KB Output is correct
7 Correct 885 ms 43588 KB Output is correct
8 Correct 1507 ms 63628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 1 ms 208 KB Output is correct
4 Correct 1 ms 208 KB Output is correct
5 Incorrect 2 ms 208 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 1 ms 208 KB Output is correct
4 Correct 1 ms 208 KB Output is correct
5 Incorrect 2 ms 208 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 1 ms 208 KB Output is correct
4 Correct 1 ms 208 KB Output is correct
5 Correct 120 ms 51300 KB Output is correct
6 Correct 148 ms 63660 KB Output is correct
7 Correct 84 ms 32724 KB Output is correct
8 Incorrect 130 ms 63596 KB Output isn't correct
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 0 ms 208 KB Output is correct
4 Incorrect 282 ms 29196 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 0 ms 208 KB Output is correct
4 Incorrect 282 ms 29196 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 237 ms 50744 KB Output is correct
4 Correct 1127 ms 63688 KB Output is correct
5 Correct 1129 ms 32200 KB Output is correct
6 Correct 1298 ms 63700 KB Output is correct
7 Correct 885 ms 43588 KB Output is correct
8 Correct 1507 ms 63628 KB Output is correct
9 Correct 1 ms 208 KB Output is correct
10 Correct 1 ms 208 KB Output is correct
11 Correct 1 ms 208 KB Output is correct
12 Correct 1 ms 208 KB Output is correct
13 Incorrect 2 ms 208 KB Output isn't correct
14 Halted 0 ms 0 KB -