Submission #650191

# Submission time Handle Problem Language Result Execution time Memory
650191 2022-10-12T16:46:02 Z PoonYaPat Rainforest Jumps (APIO21_jumps) C++14
4 / 100
1316 ms 51784 KB
#include "jumps.h"
#include <bits/stdc++.h>
using namespace std;

int n,h[200001],s[1<<19];
int l[400001][20],r[400001][20],high[400001][20];

void build(int ll, int rr, int idx) {
    if (ll>rr) return;
    if (ll==rr) s[idx]=h[ll];
    else {
        int mid=(ll+rr)/2;
        build(ll,mid,2*idx);
        build(mid+1,rr,2*idx+1);
        s[idx]=max(s[2*idx],s[2*idx+1]);
    }
}

int query(int ll, int rr, int idx, int x, int y) {
    if (ll>y ||rr<x) return 0;
    if (x<=ll && rr<=y) return s[idx];
    int mid=(ll+rr)/2;
    return max(query(ll,mid,2*idx,x,y),query(mid+1,rr,2*idx+1,x,y));
}

void init(int N, vector<int> H) {
    n=N;
    for (int i=0; i<n; ++i) h[i+1]=H[i];
    build(1,n,1);

    for (int i=1; i<=n; ++i) {
        int idx=i-1;
        while (h[idx]<h[i] && idx!=0) idx=l[idx][0];
        l[i][0]=idx;
    }

    for (int i=n; i>=1; --i) {
        int idx=i+1;
        while (h[idx]<h[i] && idx!=n+1) idx=r[idx][0];
        r[i][0]=idx;
    }

    for (int i=1; i<=n; ++i) {
        if (h[r[i][0]]>h[l[i][0]]) high[i][0]=r[i][0];
        else high[i][0]=l[i][0];
    }

    for (int i=1; i<18; ++i) {
        for (int j=1; j<=n; ++j) {
            l[j][i]=l[l[j][i-1]][i-1];
            r[j][i]=r[r[j][i-1]][i-1];
            high[j][i]=high[high[j][i-1]][i-1];
        }
    }
}

int minimum_jumps(int A, int B, int C, int D) {
    int a=++A, b=++B, c=++C, d=++D;
    int mmax=query(1,n,1,c,d),now=b;

    if (query(1,n,1,b,c-1)>mmax) return -1;

    //free range, start with considering b
    for (int i=18; i>=0; --i) {
        if (l[now][i]>=a && h[l[now][i]]<mmax) now=l[now][i]; //go to left[now][i] (in free range)
    }
    if (r[now][0]>=c) return 1;

    int ans=0;
    for (int i=18; i>=0; --i) {
        if (h[high[now][i]]<h[c] && high[now][i]!=0 && high[now][i]!=n+1) { //go to the highest point (with cost)
            ans+=(1<<i);
            now=high[now][i];
        }
    }

    if (h[l[now][0]]<mmax && l[now][0]!=0) return ans+2;

    for (int i=18; i>=0; --i) { //go from the highest point (lower than h[c]) to c
        if (h[r[now][i]]<h[c] && r[now][i]!=0 && r[now][i]!=n+1) {
            ans+=(1<<i);
            now=r[now][i];
        }
    }
    return ans+1;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 336 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 210 ms 41616 KB Output is correct
4 Correct 1316 ms 51608 KB Output is correct
5 Correct 1088 ms 26172 KB Output is correct
6 Correct 1244 ms 51600 KB Output is correct
7 Correct 930 ms 35916 KB Output is correct
8 Correct 1169 ms 51784 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 0 ms 208 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Incorrect 2 ms 336 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 0 ms 208 KB Output is correct
4 Correct 1 ms 336 KB Output is correct
5 Incorrect 2 ms 336 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 336 KB Output is correct
2 Correct 0 ms 336 KB Output is correct
3 Correct 0 ms 336 KB Output is correct
4 Correct 1 ms 208 KB Output is correct
5 Incorrect 91 ms 42036 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 0 ms 336 KB Output is correct
3 Correct 0 ms 208 KB Output is correct
4 Incorrect 271 ms 23780 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 0 ms 336 KB Output is correct
3 Correct 0 ms 208 KB Output is correct
4 Incorrect 271 ms 23780 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 336 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 210 ms 41616 KB Output is correct
4 Correct 1316 ms 51608 KB Output is correct
5 Correct 1088 ms 26172 KB Output is correct
6 Correct 1244 ms 51600 KB Output is correct
7 Correct 930 ms 35916 KB Output is correct
8 Correct 1169 ms 51784 KB Output is correct
9 Correct 1 ms 336 KB Output is correct
10 Correct 0 ms 208 KB Output is correct
11 Correct 0 ms 208 KB Output is correct
12 Correct 1 ms 336 KB Output is correct
13 Incorrect 2 ms 336 KB Output isn't correct
14 Halted 0 ms 0 KB -