Submission #518936

#TimeUsernameProblemLanguageResultExecution timeMemory
518936maomao90Rainforest Jumps (APIO21_jumps)C++17
100 / 100
1196 ms78348 KiB
#include <bits/stdc++.h> using namespace std; #include "jumps.h" #define REP(i, j, k) for (int i = j; i < k; i++) #define RREP(i, j, k) for (int i = j; i >= k; i--) template <class T> inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T& a, T b) {return a < b ? a = b, 1 : 0;} typedef long long ll; #define FI first #define SE second #define MP make_pair typedef pair<int, int> ii; typedef pair<ll, ll> pll; #define ALL(x) x.begin(), x.end() #define pb emplace_back typedef vector<int> vi; typedef vector<ii> vii; #ifdef DEBUG #define debug(args...) printf(args) #else #define debug(args...) #endif #define INF 1000000005 #define MAXN 200005 #define MAXL 20 int n; vi h; int lft[MAXL][MAXN], rht[MAXL][MAXN], big[MAXL][MAXN]; ii sp[MAXL][MAXN]; inline ii qsp(int s, int e) { int k = 31 - __builtin_clz(e - s + 1); return max(sp[k][s], sp[k][e - (1 << k) + 1]); } void init(int _n, vi _h) { n = _n; h = _h; { stack<int> stk; REP (i, 0, n) { while (!stk.empty() && h[stk.top()] < h[i]) { stk.pop(); } if (!stk.empty()) { lft[0][i] = stk.top(); } else { lft[0][i] = -1; } stk.push(i); } } { stack<int> stk; RREP (i, n - 1, 0) { while (!stk.empty() && h[stk.top()] < h[i]) { stk.pop(); } if (!stk.empty()) { rht[0][i] = stk.top(); } else { rht[0][i] = -1; } stk.push(i); } } REP (i, 0, n) { if (lft[0][i] == -1 || rht[0][i] == -1) { big[0][i] = -1; } if (h[lft[0][i]] > h[rht[0][i]]) { big[0][i] = lft[0][i]; } else { big[0][i] = rht[0][i]; } } REP (k, 1, MAXL) { REP (i, 0, n) { if (lft[k - 1][i] == -1) { lft[k][i] = -1; } else { lft[k][i] = lft[k - 1][lft[k - 1][i]]; } if (rht[k - 1][i] == -1) { rht[k][i] = -1; } else { rht[k][i] = rht[k - 1][rht[k - 1][i]]; } if (big[k - 1][i] == -1) { big[k][i] = -1; } else { big[k][i] = big[k - 1][big[k - 1][i]]; } } } REP (i, 0, n) { sp[0][i] = MP(h[i], i); } REP (k, 1, MAXL) { REP (i, 0, n - (1 << k - 1)) { sp[k][i] = max(sp[k - 1][i], sp[k - 1][i + (1 << k - 1)]); } } } int minimum_jumps(int a, int b, int c, int d) { if (b + 1 == c) { if (rht[0][b] == -1 || rht[0][b] > d) { return -1; } else { return 1; } } int rmx = qsp(c, d).FI, mmx = qsp(b + 1, c - 1).FI; if (mmx > rmx) { return -1; } int u = b; if (h[u] >= rmx) { return -1; } RREP (k, MAXL - 1, 0) { if (lft[k][u] == -1) continue; if (lft[k][u] >= a && h[lft[k][u]] < rmx) { u = lft[k][u]; } } assert(h[u] < rmx); if (h[u] > mmx) { assert(rht[0][u] >= c && rht[0][u] <= d); return 1; } int ans = 0; RREP (k, MAXL - 1, 0) { if (big[k][u] == -1) continue; if (h[big[k][u]] < mmx) { u = big[k][u]; ans += 1 << k; } } if (big[0][u] != -1 && h[big[0][u]] <= rmx) { assert(h[big[0][u]] >= mmx); assert(rht[0][big[0][u]] >= c && rht[0][big[0][u]] <= d); return ans + 2; } RREP (k, MAXL - 1, 0) { if (rht[k][u] == -1) continue; if (rht[k][u] < c) { u = rht[k][u]; ans += 1 << k; } } if (rht[0][u] <= d) { assert(rht[0][u] >= c); return ans + 1; } else { return -1; } } /* 7 3 3 2 1 6 4 5 7 4 4 6 6 1 3 5 6 0 1 2 2 */

Compilation message (stderr)

jumps.cpp: In function 'void init(int, vi)':
jumps.cpp:107:32: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
  107 |         REP (i, 0, n - (1 << k - 1)) {
      |                              ~~^~~
jumps.cpp:5:42: note: in definition of macro 'REP'
    5 | #define REP(i, j, k) for (int i = j; i < k; i++)
      |                                          ^
jumps.cpp:108:64: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
  108 |             sp[k][i] = max(sp[k - 1][i], sp[k - 1][i + (1 << k - 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...