제출 #972757

#제출 시각아이디문제언어결과실행 시간메모리
972757dubabuba밀림 점프 (APIO21_jumps)C++14
60 / 100
1368 ms172624 KiB
#include <bits/stdc++.h> #include "jumps.h" using namespace std; template<typename T> void ono_min(T &MIN, T CMP) { if(MIN > CMP) MIN = CMP; } template<typename T> void ono_max(T &MAX, T CMP) { if(MAX < CMP) MAX = CMP; } typedef pair<int, int> pii; #define ff first #define ss second #define MP make_pair const int mxk = 32; const int mxn = 2e5 + 10; const int inf = 1e9 + 10; int L[mxn], h[mxn]; int R[mxn], n; vector<int> adj[mxn]; int mx[mxk][mxn], mn[mxk][mxn]; pii ll[mxk][mxn], rr[mxk][mxn]; pii str[mxn * 4]; void build(int id, int tl, int tr) { if(tl == tr) { str[id] = MP(h[tl], tl); return; } int tm = (tl + tr) / 2; build(id * 2 + 1, tl, tm); build(id * 2 + 2, tm + 1, tr); str[id] = max(str[id * 2 + 1], str[id * 2 + 2]); } pii query(int id, int tl, int tr, int l, int r) { if(l > r) return MP(0, -1); if(tl == l && r == tr) return str[id]; int tm = (tl + tr) / 2; if(r <= tm) return query(id * 2 + 1, tl, tm, l, r); if(tm < l) return query(id * 2 + 2, tm + 1, tr, l, r); pii LQ = query(id * 2 + 1, tl, tm, l, tm); pii RQ = query(id * 2 + 2, tm + 1, tr, tm + 1, r); return max(LQ, RQ); } void init(int N, vector<int> H) { memset(L, -1, sizeof L); memset(R, -1, sizeof R); n = N; for(int i = 0; i <= N; i++) for(int k = 0; k <= mxk; k++) { mn[k][i] = mx[k][i] = 0; ll[k][i] = rr[k][i] = MP(0, 0); } stack<int> st; for(int i = 1; i < N; i++) { while(st.size() && H[st.top()] <= H[i]) st.pop(); if(st.size()) L[i] = st.top(); else L[i] = -1; st.push(i); } stack<int> en; for(int i = N - 1; i >= 0; i--) { while(en.size() && H[en.top()] <= H[i]) en.pop(); if(en.size()) R[i] = en.top(); else R[i] = -1; en.push(i); } for(int i = 0; i < N; i++) { h[i] = H[i]; if(L[i] > -1) { adj[i].push_back(L[i]); if(mn[0][H[i]] == 0) mn[0][H[i]] = H[L[i]]; ono_min(mn[0][H[i]], H[L[i]]); ono_max(mx[0][H[i]], H[L[i]]); ll[0][i] = MP(H[L[i]], L[i]); } if(R[i] > -1) { adj[i].push_back(R[i]); if(mn[0][H[i]] == 0) mn[0][H[i]] = H[R[i]]; ono_min(mn[0][H[i]], H[R[i]]); ono_max(mx[0][H[i]], H[R[i]]); rr[0][i] = MP(H[R[i]], R[i]); } } build(0, 0, n - 1); for(int k = 1; k < mxk; k++) for(int i = 1; i <= n; i++) { int mnj = mn[k - 1][i]; int mxj = mx[k - 1][i]; if(mnj) mn[k][i] = mn[k - 1][mnj]; if(mxj) mx[k][i] = mx[k - 1][mxj]; } for(int k = 1; k < mxk; k++) for(int i = 0; i < n; i++) { pii pl = ll[k - 1][i]; pii pr = rr[k - 1][i]; if(pl.ss) ll[k][i] = ll[k - 1][pl.ss]; if(pr.ss) rr[k][i] = rr[k - 1][pr.ss]; } } int solve(int s, int f) { if(s == f) return 0; int ans = 0; for(int k = mxk - 1; k >= 0; k--) if(mx[k][s] && mx[k][s] <= f) { s = mx[k][s]; ans += (1 << k); } for(int k = mxk - 1; k >= 0; k--) if(mn[k][s] && mn[k][s] <= f) { s = mn[k][s]; ans += (1 << k); } if(s == f) return ans; return inf; } int minimum_jumps(int A, int B, int C, int D) { pii bet = query(0, 0, n - 1, B + 1, C - 1); int bet_mx = bet.ff; int bet_id = bet.ss; // cout << endl; // cout << "min jump: " << A << ' ' << B << ' ' << C << ' ' << D << endl; // cout << "mid = " << bet_id << ' ' << bet_mx << endl; int l = B; for(int i = mxk - 1; i >= 0; i--) { pii p = ll[i][l]; int hi = p.ff; int id = p.ss; if(hi == 0) continue; if(hi > bet_mx) continue; if(id < A) continue; l = id; } auto think = [&](int i) -> int { if(i == -1) return inf; if(i < A) return inf; int cur = C, cmp = max(h[i], bet_mx); if(cmp < h[C]) return solve(h[i], h[C]); for(int k = mxk - 1; k >= 0; k--) { pii p = rr[k][cur]; int hi = p.ff; int id = p.ss; if(hi == 0) continue; if(hi > cmp) continue; if(id > D) continue; cur = id; } if(R[cur] == -1) return inf; if(R[cur] > D) return inf; if(cmp > h[R[cur]]) return inf; // cout << " think " << i << ' ' << R[cur] << endl; return solve(h[i], h[R[cur]]); }; int AL = think(l); int PL = think(L[l]); pii GL = query(0, 0, n - 1, A, B); int L_mx = GL.ff; int L_id = GL.ss; int LL = INT_MAX; auto go_left = [&](int ML) -> int { int ret = 0; int L_most = ML; for(int k = mxk - 1; k >= 0; k--) { pii p = ll[k][L_most]; int hi = p.ff; int id = p.ss; if(hi == 0) continue; if(hi > bet_mx) continue; L_most = id; ret += (1 << k); } if(L[L_most] != -1) { L_most = L[L_most]; ret++; } int R_most = L_most; for(int k = mxk - 1; k >= 0; k--) { if(C <= R_most && R_most <= D) return ret; pii p = rr[k][R_most]; int hi = p.ff; int id = p.ss; if(hi == 0) continue; if(id > D) continue; R_most = id; ret += (1 << k); } return INT_MAX; }; LL = go_left(L_id); int L_most = B, sus = 0; for(int k = mxk - 1; k >= 0; k--) { pii p = ll[k][L_most]; int hi = p.ff; int id = p.ss; if(hi == 0) continue; if(hi > bet_mx) continue; sus += (1 << k); L_most = id; } L_most = L[L_most]; int gay = inf; if(L_most != -1 && L_most < A) { int R_most = C; for(int k = mxk - 1; k >= 0; k--) { pii p = ll[k][R_most]; int hi = p.ff; int id = p.ss; if(hi == 0) continue; if(hi > h[L_most]) continue; if(id > D) continue; R_most = id; } R_most = R[R_most]; // cout << A << ' ' << B << ' ' << C << ' ' << D << endl; // cout << L_most << ' ' << R_most << endl; if(R_most != -1 && C <= R_most && R_most <= D) gay = solve(h[L_most], h[R_most]) + solve(L_mx, h[L_most]); } if(min({AL, PL, LL, gay}) != inf) return min({AL, PL, LL, gay}); return -1; } // 7 4 1 2 5 3 6 9 8 // 9 8 7 6 5 4 3 2 1

컴파일 시 표준 에러 (stderr) 메시지

jumps.cpp: In function 'int minimum_jumps(int, int, int, int)':
jumps.cpp:137:6: warning: unused variable 'bet_id' [-Wunused-variable]
  137 |  int bet_id = bet.ss;
      |      ^~~~~~
jumps.cpp: In function 'void init(int, std::vector<int>)':
jumps.cpp:54:23: warning: iteration 32 invokes undefined behavior [-Waggressive-loop-optimizations]
   54 |   mn[k][i] = mx[k][i] = 0;
      |              ~~~~~~~~~^~~
jumps.cpp:53:19: note: within this loop
   53 |  for(int k = 0; k <= mxk; k++) {
      |                 ~~^~~~~~
#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...