제출 #1307475

#제출 시각아이디문제언어결과실행 시간메모리
1307475repmann밀림 점프 (APIO21_jumps)C++20
0 / 100
60 ms26668 KiB
#include <bits/stdc++.h> #include "jumps.h" using namespace std; int N; int A[200001]; int MAX[18][200001], MIN[18][200001]; void init(int n, vector <int> a) { N = n; for(int i = 1; i <= N; i++) A[i] = a[i - 1]; stack <pair <int, int>> S; for(int i = 1; i <= N; i++) { while(S.size() && (S.top().first < A[i])) S.pop(); if(S.size()) MIN[0][i] = S.top().second; S.push({A[i], i}); } while(S.size()) S.pop(); for(int i = N; i >= 1; i--) { while(S.size() && (S.top().first < A[i])) S.pop(); if(S.size()) MAX[0][i] = S.top().second; S.push({A[i], i}); } for(int i = 1; i <= N; i++) if(A[MIN[0][i]] > A[MAX[0][i]]) swap(MIN[0][i], MAX[0][i]); vector <pair <int, int>> V; for(int i = 1; i <= N; i++) V.push_back({A[i], i}); sort(V.begin(), V.end(), greater <pair <int, int>>()); for(pair <int, int> p : V) { int i = p.second; for(int j = 1; j <= 17; j++) MIN[j][i] = MIN[j - 1][MIN[j - 1][i]]; for(int j = 1; j <= 17; j++) MAX[j][i] = MAX[j - 1][MAX[j - 1][i]]; } return; } int minimum_jumps(int a, int b, int c, int d) { if((a != b) || (c != d)) return -1; a++, b++, c++, d++; if(min(MIN[0][c], MAX[0][c]) >= a) return -1; int ret = 0; for(int j = 17; j >= 0; j--) if(MAX[j][a] && (A[MAX[j][a]] <= A[c])) {a = MAX[j][a]; ret += 1 << j;} for(int j = 17; j >= 0; j--) if(MAX[j][a] && (A[MIN[j][a]] <= A[c])) {a = MIN[j][a]; ret += 1 << j;} return ret; }
#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...