Submission #569757

#TimeUsernameProblemLanguageResultExecution timeMemory
569757LoboRainforest Jumps (APIO21_jumps)C++17
23 / 100
1116 ms63064 KiB
#include "jumps.h" #include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() const int maxn = 2e5+10; int n, h[maxn], nx[maxn][25], nxl[maxn][25], nxr[maxn][25]; void init(int N, vector<int> H) { n = N; for(int i = 1; i <= n; i++) { h[i] = H[i-1]; } //os proximos da esquerda e direita de cada um e 0 se não tiver stack<pair<int,int>> stl; for(int i = 1; i <= n; i++) { while(stl.size() && stl.top().fr < h[i]) { stl.pop(); } if(stl.size()) nxl[i][0] = stl.top().sc; else nxl[i][0] = 0; stl.push(mp(h[i],i)); } stack<pair<int,int>> str; for(int i = n; i >= 1; i--) { while(str.size() && str.top().fr < h[i]) { str.pop(); } if(str.size()) nxr[i][0] = str.top().sc; else nxr[i][0] = 0; str.push(mp(h[i],i)); } //sei qual o proximo normal de cada um for(int i = 1; i <= n; i++) { if(nxr[i][0] == 0 || h[nxl[i][0]] > h[nxr[i][0]]) nx[i][0] = nxl[i][0]; else nx[i][0] = nxr[i][0]; // cout << i << " " << nx[i][0] << " " << nxl[i][0] << " " << nxr[i][0] << endl; } for(int pt = 1; pt <= 20; pt++) { for(int i = 1; i <= n; i++) { nx[i][pt] = nx[nx[i][pt-1]][pt-1]; } } for(int pt = 1; pt <= 20; pt++) { for(int i = 1; i <= n; i++) { nxl[i][pt] = nxl[nxl[i][pt-1]][pt-1]; } } for(int pt = 1; pt <= 20; pt++) { for(int i = 1; i <= n; i++) { nxr[i][pt] = nxr[nxr[i][pt-1]][pt-1]; } } } int minimum_jumps(int A, int B, int C, int D) { A++; B++; C++; D++; //ir do a para o c int s = A; int t = C; int ans = 0; for(int pt = 20; pt >= 0; pt--) { if(nx[s][pt] == 0 || h[nx[s][pt]] > h[t]) continue; ans+= (1<<pt); s = nx[s][pt]; } //vai so para a direita ate chegar no t for(int pt = 20; pt >= 0; pt--) { if(nxr[s][pt] == 0 || nxr[s][pt] > t) continue; ans+= (1<<pt); s = nxr[s][pt]; } if(s == t) return ans; else return -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...