Submission #1238700

#TimeUsernameProblemLanguageResultExecution timeMemory
1238700Joon_YorigamiRainforest Jumps (APIO21_jumps)C++17
100 / 100
589 ms97508 KiB
#include <bits/stdc++.h>
#include "jumps.h"
using namespace std;
using ll = long long;
using vll = vector<long long>;
constexpr ll inf = LONG_LONG_MAX;
constexpr ll max_n = 200005;
constexpr ll max_log = 20;
vector<vll> l;
vector<vll> r;
vector<vll> greedy;

void init(int n,vector<int> h)
{
  h.push_back(-1);
  vector<vll>(max_log,vll(max_n,n)).swap(l);
  vector<vll>(max_log,vll(max_n,n)).swap(r);
  vector<vll>(max_log,vll(max_n,n)).swap(greedy);
  stack<int> s;
  for(int i=0;i<n;i++)
  {
    while(!s.empty()&&h[s.top()]<h[i])
      s.pop();
    if(!s.empty())
      l[0][i]=s.top();
    s.push(i);
  }
  stack<int>().swap(s);
  for(int i=n-1;i>=0;i--)
  {
    while(!s.empty()&&h[s.top()]<h[i])
      s.pop();
    if(!s.empty())
      r[0][i]=s.top();
    s.push(i);
  }
  for(int i=0;i<n;i++)
  {
    if(h[l[0][i]]>h[r[0][i]])
      greedy[0][i]=l[0][i];
    else
      greedy[0][i]=r[0][i];
  }
  for(int i=1;i<max_log;i++)
  {
    for(int j=0;j<n;j++)
    {
      l[i][j]=l[i-1][l[i-1][j]];
      r[i][j]=r[i-1][r[i-1][j]];
      greedy[i][j]=greedy[i-1][greedy[i-1][j]];
    }
  }
}

int minimum_jumps(int a, int b, int c, int d)
{
  int ans=0;
  for(int i=max_log-1;i>=0;i--)
    if(l[i][b]>=a&&r[0][l[i][b]]<=d)
      b=l[i][b];
  if(c<=r[0][b]&&r[0][b]<=d)
    return 1;
  for(int i=max_log-1;i>=0;i--)
  {
    if(r[0][greedy[i][b]]<c)
    {
      ans+=(1ll<<i);
      b=greedy[i][b];
    }
  }
  if(r[0][greedy[0][b]]<=d)
    return ans+2;
  for(int i=max_log-1;i>=0;i--)
  {
    if(r[i][b]<c)
    {
      ans+=(1ll<<i);
      b=r[i][b];
    }
  }
  if (r[0][b]<c||r[0][b]>d) return -1;
  else return ans+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...