Submission #528621

#TimeUsernameProblemLanguageResultExecution timeMemory
528621DanerZeinRainforest Jumps (APIO21_jumps)C++14
33 / 100
4046 ms16780 KiB
#include "jumps.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
const int MAX_N=2e5+10;
const int MAX_P=MAX_N*4;
int st[MAX_P];
int val[MAX_N];
int dis[MAX_N];
int n;
vector<vi> G;
void init(int node,int a,int b){
  if(a==b){
    st[node]=val[a];
    return;
  }
  int mid=(a+b)/2,le=2*node+1,ri=2*node+2;
  init(le,a,mid);
  init(ri,mid+1,b);
  st[node]=max(st[le],st[ri]);
}
int query(int node,int a,int b,int l,int r){
  if(b<l || a>r) return 0;
  if(l<=a && r>=b) return st[node];
  int mid=(a+b)/2,le=2*node+1,ri=2*node+2;
  return max(query(le,a,mid,l,r),query(ri,mid+1,b,l,r));
}
int izquier(int x){
  int q=query(0,0,n-1,0,x);
  if(q==val[x]) return -1;
  int l=0,r=x;
  while(r-l>1){
    int mid=(l+r)/2;
    q=query(0,0,n-1,mid,r);
    if(q>val[x])
      l=mid;
    else r=mid;
  }
  return l;
}
int derecha(int x){
  int q=query(0,0,n-1,x,n-1);
  if(q==val[x]) return -1;
  int l=x,r=n-1;
  while(r-l>1){
    int mid=(l+r)/2;
    q=query(0,0,n-1,l,mid);
    if(q>val[x]) r=mid;
    else l=mid;
  }
  return r;
}
int ans[2010][2010];
bool iq[MAX_N];
void bfs(int A,int B){
  for(int i=0;i<n;i++) {
    dis[i]=1e9;
    iq[i]=0;
  }
  queue<int> q;
  for(int i=A;i<=B;i++){
    dis[i]=0;
    iq[i]=1;
    q.push(i);
  }
  while(!q.empty()){
    int x=q.front();
    iq[x]=0;
    q.pop();
    for(auto &v:G[x]){
      if(dis[v]>dis[x]+1){
	dis[v]=dis[x]+1;
	if(!iq[v]){
	  q.push(v);
	  iq[v]=1;
	}
      }
    }
  }
}
void init(int N, std::vector<int> H) {
  for(int i=0;i<N;i++) val[i]=H[i];
  G.resize(N+1);
  n=N;
  init(0,0,n-1);
  for(int i=0;i<n;i++){
    int l=izquier(i);
    int r=derecha(i);
    if(l!=-1) G[i].push_back(l);
    if(r!=-1) G[i].push_back(r);
  }
}
int minimum_jumps(int A, int B, int C, int D) {
  bfs(A,B);
  int res=1e9;
  for(int j=C;j<=D;j++){
    res=min(res,dis[j]);
  }
  if(res>=1e9) res=-1;
  return res;
}
#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...