Submission #980715

#TimeUsernameProblemLanguageResultExecution timeMemory
980715vjudge1Rainforest Jumps (APIO21_jumps)C++17
60 / 100
4041 ms46588 KiB
#include <bits/stdc++.h> #include "jumps.h" using namespace std; const int N = 200200; int n; int h[N]; int to[N][18][2]; vector<int> g[N]; vector<int> bfs(vector<int> st) { vector<int> dist(n, 1e9); queue<int> q; for (int c : st) { dist[c] = 0; q.push(c); } while (!q.empty()) { int x = q.front(); q.pop(); for (int to : g[x]) { if (dist[to] > dist[x] + 1) { dist[to] = dist[x] + 1; q.push(to); } } } return dist; } bool is1st = true; void init(int N, vector<int> H) { n = N; for (int i = 0; i < N; i++) { h[i] = H[i]; is1st &= (h[i] == i + 1); } vector<int> stack; for (int i = 0; i < N; i++) { while (!stack.empty() && H[stack.back()] < H[i]) stack.pop_back(); if (stack.empty()) to[i][0][0] = i; else to[i][0][0] = stack.back(); stack.push_back(i); } stack.clear(); for (int i = N - 1; i >= 0; i--) { while (!stack.empty() && H[stack.back()] < H[i]) stack.pop_back(); if (stack.empty()) to[i][0][1] = i; else to[i][0][1] = stack.back(); stack.push_back(i); } for (int i = 0; i < N; i++) { g[i].push_back(to[i][0][0]); g[i].push_back(to[i][0][1]); if (H[to[i][0][0]] < H[to[i][0][1]]) swap(to[i][0][0], to[i][0][1]); } for (int k = 1; k < 18; k++) { for (int i = 0; i < N; i++) { to[i][k][0] = to[ to[i][k - 1][0] ][k - 1][0]; to[i][k][1] = to[ to[i][k - 1][1] ][k - 1][1]; } } } int minimum_jumps(int A, int B, int C, int D) { if (is1st) { return C - B; } if (A == B && C == D) { int ans = 0; int cur = A; for (int k = 17; k >= 0; k--) { if (h[to[cur][k][0]] < h[C]) { cur = to[cur][k][0]; ans += (1 << k); } } if (to[cur][0][0] == C) return ans + 1; for (int k = 17; k >= 0; k--) { if (h[to[cur][k][1]] < h[C]) { cur = to[cur][k][1]; ans += (1 << k); } } if (to[cur][0][1] == C) return ans + 1; return -1; } vector<int> st; for (int i = A; i <= B; i++) st.push_back(i); auto dist = bfs(st); int res = 1e9; for (int i = C; i <= D; i++) res = min(res, dist[i]); if (res == 1e9) return -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...