제출 #980555

#제출 시각아이디문제언어결과실행 시간메모리
980555vjudge1밀림 점프 (APIO21_jumps)C++17
21 / 100
4010 ms10812 KiB
#include "jumps.h" #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 100, INF = 1e9; vector<int> v[N]; int dist[N], n; queue<int> q; void bfs() { while (!q.empty()) { int cur = q.front(); q.pop(); for (auto to : v[cur]) { if (dist[to] != INF) continue; dist[to] = dist[cur] + 1; q.push(to); } } } void init(int N, vector<int> H) { vector<pair<int, int>> ord(N); set<int> s; for (int i = 0; i < N; i++) { ord[i].first = H[i]; ord[i].second = i; } n = N; sort(ord.begin(), ord.end()); reverse(ord.begin(), ord.end()); for (int i = 0; i < N; i++) { vector<int> todo; while (true) { todo.push_back(ord[i].second); auto l = lower_bound(s.begin(), s.end(), ord[i].second); if (l != s.end()) { v[ord[i].second].push_back(*l); // cout << ord[i].second << " " << *l << "\n"; } if (l != s.begin()) { --l; v[ord[i].second].push_back(*l); // cout << ord[i].second << " " << *l << "\n"; } if (i + 1 < N && ord[i].first == ord[i + 1].first) { i++; continue; } break; } for (auto it : todo) s.insert(it); } } int minimum_jumps(int A, int B, int C, int D) { int res = INF; for (int i = 0; i < n; i++) { dist[i] = INF; } for (int i = A; i <= B; i++) { dist[i] = 0; q.push(i); } bfs(); for (int i = C; i <= D; i++) { res = min(res, dist[i]); } return (res == INF ? -1 : 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...