Submission #559477

#TimeUsernameProblemLanguageResultExecution timeMemory
559477nghiass001Rainforest Jumps (APIO21_jumps)C++17
100 / 100
1152 ms50516 KiB
#include <bits/stdc++.h> #define FOR(i,l,r) for(int i=(l); i<=(r); ++i) #define REP(i,l,r) for(int i=(l); i<(r); ++i) #define FORD(i,r,l) for(int i=(r); i>=(l); --i) #define REPD(i,r,l) for(int i=(r)-1; i>=(l); --i) using namespace std; const int N = 2e5 + 5, logN = 18, INF = 0x3c3c3c3c; int n, a[N], lft[N][logN], rgt[N][logN], high[N][logN]; vector<int> S[N]; void init(int N, vector<int> H) { n = N + 2; REP(i, 1, n) a[i] = H[i - 1]; a[0] = n; a[n] = n + 1; FOR(i, 0, n) rgt[i][0] = n; vector<int> Q; FOR(i, 0, n) { while (!Q.empty() && a[Q.back()] < a[i]) { rgt[Q.back()][0] = i; Q.pop_back(); } if (Q.size()) lft[i][0] = Q.back(); Q.push_back(i); } FOR(i, 0, n) high[i][0] = (a[lft[i][0]] > a[rgt[i][0]] ? lft[i][0] : rgt[i][0]); REP(j, 1, 18) FOR(i, 0, n) { lft[i][j] = lft[lft[i][j - 1]][j - 1]; rgt[i][j] = rgt[rgt[i][j - 1]][j - 1]; high[i][j] = high[high[i][j - 1]][j - 1]; } } int minimum_jumps(int A, int B, int C, int D) { ++A; ++B; ++C; ++D; int pos = B; REPD(i, logN, 0) { int new_pos = lft[pos][i]; if (A <= new_pos && rgt[new_pos][0] <= D) pos = new_pos; } if (C <= rgt[pos][0] && rgt[pos][0] <= D) return 1; int sum = 0; REPD(i, logN, 0) { int new_pos = high[pos][i]; if (rgt[new_pos][0] < C) sum += 1 << i, pos = new_pos; } { int new_pos = high[pos][0]; int new_sum = sum + 1; if (C <= rgt[new_pos][0] && rgt[new_pos][0] <= D) return new_sum + 1; } REPD(i, 18, 0) { int new_pos = rgt[pos][i]; if (rgt[new_pos][0] < C) sum += 1 << i, pos = new_pos; } { int new_pos = rgt[pos][0]; int new_sum = sum + 1; if (C <= rgt[new_pos][0] && rgt[new_pos][0] <= D) return new_sum + 1; } return -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...