제출 #902396

#제출 시각아이디문제언어결과실행 시간메모리
902396efedmrlr밀림 점프 (APIO21_jumps)C++17
23 / 100
896 ms75764 KiB
#include "jumps.h" // #pragma GCC optimize("O3,Ofast,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include <bits/stdc++.h> using namespace std; #define lli long long int #define MP make_pair #define pb push_back #define REP(i,n) for(int i = 0; (i) < (n); (i)++) void fastio() { ios_base::sync_with_stdio(false); cin.tie(NULL); } const double EPS = 0.00001; const int INF = 1e9+500; const int ALPH = 26; const int LGN = 25; const int MAXN = 2e5+5; constexpr int MOD = 1e9+7; int n,m,q; int lg[MAXN]; struct SparseT { vector<int> data[LGN]; int sz; SparseT() : sz(0) {}; void reset(int s, vector<int> &vec) { sz = s; REP(i,LGN) data[i].assign(s + 2, 0); for(int i = 0; i<s; i++) { data[0][i] = vec[i]; } for(int k = 1; k<LGN; k++) { for(int i = 0; i < s; i++) { if(i + (1<<(k - 1)) >= s) break; data[k][i] = max(data[k - 1][i], data[k - 1][i + (1<<(k - 1))]); } } } int query(int l, int r) { l = max(l, 0); r = min(r, sz - 1); if(l > r) return 0; int len = r - l + 1; return max(data[lg[len]][l], data[lg[len]][r - (1<<lg[len]) + 1]); } }; vector<array<int,2> > adj; vector<vector<int> > lift(LGN, vector<int>()); vector<vector<int> > low(LGN, vector<int>()); vector<int> h, revh(MAXN, 0); SparseT sp; void init(int N, std::vector<int> H) { lg[1] = 0; for(int i = 2; i<MAXN; i++) { lg[i] = lg[i / 2] + 1; } vector<array<int,2> > srt(N); set<int> st; H.pb(INF); h = H; n = N; sp.reset(N + 1, h); for(int i = 0; i<n; i++) { revh[h[i]] = i; } adj.assign(N + 5, array<int,2>({N, N}) ); adj[N] = {N, N}; REP(i, LGN) lift[i].assign(N + 5, N); REP(i, LGN) low[i].assign(N + 5, N); REP(i,N) { srt[i] = {H[i], i}; st.insert(i); } sort(srt.begin(), srt.end()); for(auto c : srt) { st.erase(c[1]); auto itr = st.lower_bound(c[1]); if(st.size() == 0) break; if(itr != st.end()) { adj[c[1]][1] = *itr; } if(itr != st.begin()) { itr--; adj[c[1]][0] = *itr; } if(H[adj[c[1]][0]] > H[adj[c[1]][1]]) { swap(adj[c[1]][0], adj[c[1]][1]); } } for(int i = 0; i<n; i++) { lift[0][i] = adj[i][1]; low[0][i] = adj[i][0]; } for(int k = 1; k<LGN; k++) { for(int i = 0; i<n; i++) { lift[k][i] = lift[k - 1][lift[k - 1][i]]; low[k][i] = low[k - 1][low[k - 1][i]]; } } } int minimum_jumps(int A, int B, int C, int D) { if(h[A] > h[C]) return -1; int ans = 0; for(int i = LGN - 1; i>=0; i--) { if(h[ lift[i][A] ] <= h[C]) { ans += 1<<i; A = lift[i][A]; } } for(int i = LGN - 1; i>=0; i--) { if(h[ low[i][A] ] <= h[C]) { ans += 1<<i; A = low[i][A]; } } if(A != C) return -1; return ans; }
#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...