Submission #804987

#TimeUsernameProblemLanguageResultExecution timeMemory
804987radaiosm7Rainforest Jumps (APIO21_jumps)C++11
0 / 100
192 ms37984 KiB
#include "jumps.h"
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int i, n, x;
stack<pair<int, int> > S;
vector<int> adj[200005];
int pos[200005][2];
int rmv[200005];
int h[200005];
int up[200005][22];
int val[200005][22];

void dfs(int x) {
  for (int k=2; k <= 21; ++k) up[x][k] = up[up[x][k-1]][k-1];
  if (x != 0) val[x][0] = pos[x][1]-pos[x][0];
  for (int k=1; k <= 21; ++k) val[x][k] = min(val[x][k-1], val[up[x][k-1]][k-1]);
  for (auto y : adj[x]) dfs(y);
}

void init(int N, vector<int> H) {
  n = N;
  for (i=1; i <= n; ++i) h[i] = H[i-1];
  for (i=1; i <= n; ++i) rmv[i] = -1;
  while (!S.empty()) S.pop();
  S.push(make_pair(INT_MAX, 0));
  up[0][0] = 0;
  up[0][1] = 0;
  val[0][0] = INT_MAX;

  for (i=1; i <= n; ++i) {
    up[i][0] = i;
    while (!S.empty() && S.top().X < h[i]) S.pop();
    adj[S.top().Y].push_back(i);
    up[i][1] = S.top().Y;
    S.push(make_pair(h[i], i));
    pos[i][0] = (int)S.size()-1;
  }

  while (!S.empty()) S.pop();
  S.push(make_pair(INT_MAX, 0));

  for (i=n; i >= 1; --i) {
    while (!S.empty() && S.top().X < h[i]) {
      rmv[S.top().Y] = i;
      S.pop();
    }

    S.push(make_pair(h[i], i));
    pos[i][1] = (int)S.size()-1;
  }

  dfs(0);
}

int minimum_jumps(int A, int B, int C, int D) {
  ++A;
  ++B;
  ++C;
  ++D;

  int ans = INT_MAX;
  if (A <= rmv[C]) return -1;

  for (int k=21; k >= 0; --k) {
    if (up[A][k] > rmv[C]) {
      ans = min(ans, val[A][k]);
      A = up[A][k];
    }
  }

  return (ans == INT_MAX) ? -1 : (pos[B][0]+ans-pos[C][1]);
}
#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...