제출 #980374

#제출 시각아이디문제언어결과실행 시간메모리
980374vjudge1Rainforest Jumps (APIO21_jumps)C++17
21 / 100
596 ms1048576 KiB
#include "jumps.h" #include<bits/stdc++.h> using namespace std; #define ll long long const int mod = 1e9 + 7; const int inf = 1e9; template<typename T> int len(T &a){return a.size();} vector<int> lef, rig; vector<vector<int>> g; int n; bool sub1 = 1; vector<vector<int>> dis; struct Segtree{ vector<int> t; int n; void init(int _n){ n = _n; t.resize(2 * n); } int merge(const int &a, const int &b){ return min(a, b); } void build(vector<int> &a){ init(len(a)); for(int i = 0; i < n; i ++) t[i + n] = a[i]; for(int i = n - 1; i > 0; i --) t[i] = merge(t[i << 1], t[i << 1 | 1]); } int get(int l, int r){ l += n; r += n; int res = inf; while(l <= r){ if(l % 2) res = merge(res, t[l ++]); if(r % 2 == 0) res = merge(res, t[r --]); l /= 2; r /= 2; } return res; } }; vector<Segtree> t; void init(int N, vector<int> h) { n = N; vector<int> st; lef.resize(n), rig.resize(n); g.resize(n); t.resize(n); dis.assign(n, vector<int> (n, inf)); for(int i = 0; i < n; i ++){ if(h[i] != i + 1) sub1 = 0; while(!st.empty() && h[st.back()] <= h[i]) st.pop_back(); if(st.empty()) lef[i] = -1; else lef[i] = st.back(); st.push_back(i); } if(sub1) return; st.clear(); for(int i = n - 1; i >= 0; i --){ while(!st.empty() && h[st.back()] <= h[i]) st.pop_back(); if(st.empty()) rig[i] = n; else rig[i] = st.back(); st.push_back(i); } for(int i = 0; i < n; i ++){ if(~lef[i]) g[i].push_back(lef[i]); if(rig[i] != n) g[i].push_back(rig[i]); } auto bfs = [&](int beg){ queue<int> q; q.push(beg); dis[beg][beg] = 0; while(!q.empty()){ int f = q.front(); q.pop(); for(auto u : g[f]){ if(dis[beg][u] != inf) continue; dis[beg][u] = dis[beg][f] + 1; q.push(u); } } }; for(int i = 0; i < n; i ++){ bfs(i); t[i].build(dis[i]); } } int minimum_jumps(int A, int B, int C, int D) { if(sub1) return C - B; int mn = inf; for(int i = A; i <= B; i ++) mn = min(mn, t[i].get(C, D)); return (mn == inf ? -1 : mn); }
#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...