Submission #1336123

#TimeUsernameProblemLanguageResultExecution timeMemory
1336123DanielPr8Rainforest Jumps (APIO21_jumps)C++20
44 / 100
754 ms132804 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvl = vector<vll>;
using pll = pair<ll,ll>;
using vpl = vector<pll>;
using vvp = vector<vpl>;

#define f first
#define s second
#define pb push_back
#define all(v) v.begin(),v.end()
vvl lef, ri;
vvp bot;
ll n;vector<int> h;
ll lasbf(ll i, ll x){
    for(ll j = 19; j >= 0; --j){
        if(lef[j][i]>=x){
            i=lef[j][i];
        }
    }
    return i;
}
pll calc(ll a, ll b, ll i){
    pll ans = {n,-1};
    if(a!=-1){
        ans.f = min(bot[i][a].f, ans.f);
        ans.s = max(bot[i][a].s, ans.s);
    }
    else ans.f=-1;
    if(b!=n){
        ans.f = min(bot[i][b].f, ans.f);
        ans.s = max(bot[i][b].s, ans.s);
    }
    else ans.s=n;
    return ans;
}

ll he(ll a){
    if(a==-1)return -1;
    if(a==n)return 1e15;
    else return h[a];
}

void init(int N, std::vector<int> H) {n=N;h=H;
    vll st;
    lef = vvl(20, vll(n,-1));
    ri = vvl(20, vll(n,n));
    bot = vvp(20, vpl(n,{n,-1}));
    for(ll i = 0; i < n; ++i){
        while(!st.empty() && h[st.back()]<=h[i]){
            st.pop_back();
        }
        if(st.empty())lef[0][i]=-1;
        else lef[0][i] = st.back();
        st.pb(i);
    }
    st.clear();
    for(ll i = n-1; i >= 0; --i){
        while(!st.empty() && h[st.back()]<=h[i]){
            st.pop_back();
        }
        if(st.empty())ri[0][i]=n;
        else ri[0][i] = st.back();
        st.pb(i);
        bot[0][i] = {lef[0][i],ri[0][i]};
    }
    for(ll i = 1; i < 20; ++i){
        for(ll j = 0; j < n; ++j){
            if(lef[i-1][j]!=-1)lef[i][j]=lef[i-1][lef[i-1][j]];
            if(ri[i-1][j]!=n)ri[i][j]=ri[i-1][ri[i-1][j]];
            bot[i][j] = calc(bot[i-1][j].f, bot[i-1][j].s, i-1);
        }
    }
}

int minimum_jumps(int a, int b, int c, int d) {
    ll mx = lasbf(d,c);
    ll bord = lef[0][mx];
    if(bord>=b)return -1;
    a = max<ll>(a,bord+1);
    a = b = lasbf(b,a);
    ll ans = 0;
    for(ll i = 19; i>=0; --i){
        auto [na,nb] = calc(a,b,i);
        if(max(he(na),he(nb))<h[mx]){
            a=na;b=nb;
            ans += (1<<i);
        }
    }
    if(he(a)<he(b))swap(a,b);
    for(ll i = 19; i>=0; --i){
        if(ri[i][a]<c){
            a=ri[i][a];
            ans += (1<<i);
        }
    }
    return ans+1;
}


// int main() {
//   int N, Q;
//   assert(2 == scanf("%d %d", &N, &Q));
//   std::vector<int> H(N);
//   for (int i = 0; i < N; ++i) {
//     assert(1 == scanf("%d", &H[i]));
//   }
//   init(N, H);

//   for (int i = 0; i < Q; ++i) {
//     int A, B, C, D;
//     assert(4 == scanf("%d %d %d %d", &A, &B, &C, &D));
//     printf("%d\n", minimum_jumps(A, B, C, D));
//   }
//   return 0;
// }
#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...