Submission #569786

#TimeUsernameProblemLanguageResultExecution timeMemory
569786LoboRainforest Jumps (APIO21_jumps)C++17
48 / 100
1747 ms67148 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]; pair<int,int> tr[4*maxn]; void att(int no, int l, int r, int pos, int val) { if(l > pos || r < pos) return; if(l == r) { tr[no] = mp(val,l); return; } int f1 = 2*no; int f2 = 2*no+1; int mid = (l+r)/2; att(f1,l,mid,pos,val); att(f2,mid+1,r,pos,val); tr[no] = max(tr[f1],tr[f2]); } pair<int,int> qrrmx(int no, int l, int r, int L, int R) { if(l > R || r < L) return mp(0,0); if(l >= L && r <= R) return tr[no]; int f1 = 2*no; int f2 = 2*no+1; int mid = (l+r)/2; return max(qrrmx(f1,l,mid,L,R),qrrmx(f2,mid+1,r,L,R)); } void init(int N, vector<int> H) { n = N; for(int i = 1; i <= n; i++) { h[i] = H[i-1]; att(1,1,n,i,h[i]); } //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 //pego o maior cara entre a e b < c //na vez do h[c] qual era o maior do intervalo int s = 0; int l = A; int r = B; while(l <= r) { int mid = (l+r)/2; // cout << mid << " " << qrrmx(1,1,n,mid,B).fr << endl; if(qrrmx(1,1,n,mid,B).fr < h[C]) { s = mid; r = mid-1; } else { l = mid+1; } } if(s == 0) return -1; s = qrrmx(1,1,n,s,B).sc; int t = C; int ans = n+10; int ans1 = 0; for(int pt = 20; pt >= 0; pt--) { if(nx[s][pt] == 0 || h[nx[s][pt]] > h[t]) continue; ans1+= (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; ans1+= (1<<pt); s = nxr[s][pt]; } if(s == t) ans = min(ans, ans1); if(ans <= n) 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...