Submission #568298

#TimeUsernameProblemLanguageResultExecution timeMemory
568298drdilyorRainforest Jumps (APIO21_jumps)C++17
25 / 100
822 ms16208 KiB
#if defined(ONPC) && !defined(_GLIBCXX_ASSERTIONS)
    #define _GLIBCXX_ASSERTIONS
#endif
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
#include "jumps.h"
#ifdef ONPC
    #include "t_debug.cpp"
#else
    #define debug(...) 42
#endif
#define allit(a) (a).begin(), (a).end()
#define sz(a) ((int) (a).size())

using namespace std;
using ll = long long;
using vi = vector<int>;
namespace pd = __gnu_pbds;
template<typename K>
using ordered_set = pd::tree<K, pd::null_type, less<int>, pd::rb_tree_tag, pd::tree_order_statistics_node_update>;
template<typename... T>
using gp_hash_table = pd::gp_hash_table<T...>;//simple using statement gives warnings

const int INF = 1e9;
const ll INFL = 1e18;
const int N = 2000;
const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count();
mt19937 rng(RANDOM);

int subtask;
vector<vi> adj;

int memo[N][N];

int dis(int i, int j) {
    if (i == j) return 0;
    if (memo[i][j] != 0) return memo[i][j];
    int res = INF;
    for (int e : adj[i]) {
        res = min(res, dis(e, j));
    }
    return memo[i][j] = 1+res;
}

void init_2_3(int n, vi& h) {
    adj.resize(n);
    memset(memo, 0, sizeof(memo));
    for (int i = 0; i < n; i++) {
        int j = i-1, k = i+1;
        for (; j >= 0; j--) {
            if (h[j] > h[i]) break;
        }
        for (; k < n; k++) {
            if (h[k] > h[i]) break;
        }
        if (j >= 0) adj[i].push_back(j);
        if (k < n) adj[i].push_back(k);
    }
}

void init(int n, std::vector<int> h) {
    if (n <= 2000) {
        subtask = 2;
        init_2_3(n, h);
    } else {
        subtask = 1;
    }
}

int minimum_jumps_2_3(int a, int b, int c, int d) {
    int res = INF;
    for (int i = a; i <= b; i++) {
        for (int j = c; j <= d; j++) {
            res = min(res, dis(i, j));
        }
    }
    return (res < INF ? res : -1);
}

int minimum_jumps(int A, int B, int C, int D) {
    if (subtask == 2) return minimum_jumps_2_3(A,B,C,D);
    else return C - B;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...