Submission #949014

#TimeUsernameProblemLanguageResultExecution timeMemory
949014vjudge1Rainforest Jumps (APIO21_jumps)C++17
33 / 100
4054 ms42852 KiB
#include <bits/stdc++.h> #define endl '\n' #define mp make_pair #define pb push_back #define f first #define s second #define fo(i,n) for(auto i =0 ; i < n;i++) #define fore(i,l,r) for(auto i = l; i < r;i++) #define forex(i,r,l) for(auto i = r; i >= l; i--) #define ffo(i,n) forex(i,n-1,0) #define all(x) x.begin(),x.end() #define lsb(x) x&(-x) #define sz(x) (int)x.size() #define gcd(a,b) __gcd(a,b) #define vii vector<ii> using namespace std; using ii = pair<int,int>; using ll = long long; using ull = unsigned long long; using vi = vector<int>; void valid(int in){cout<<((in)?"YES\n":"NO\n");return;} const int N=2e5+7,LOG = 20; struct spt{ vector<vi> sp;int n;spt(){} void make(int sz){n = sz; sp.resize(n+1, vi(LOG,0)); for(int bit = 1;bit< LOG; bit++){ for(int i= 0; i < n-(1<<bit)+1; i++){ sp[i][bit] = max(sp[i][bit-1], sp[i+(1<<(bit-1))][bit-1]); } } } void make(vi &arr){n=sz(arr);sp.resize(n+1, vi(LOG,0));fo(i,sz(arr))sp[i][0]=arr[i];make(sz(arr));} int query(int l, int r ){ int k = r-l+1; int lg = log2(k); return max(sp[l][lg], sp[(r- (1<<lg))+ 1][lg]); } int lwb(int idx, int val){ int l = idx, r = n-1; while(l<=r){ int mid = (l+r)/2; if(query(idx,mid)>sp[idx][0])r=mid-1; else l = mid+1; }return l; } int upb(int idx ,int val){ int l = 0, r = idx; while(l<=r){ int mid = (l+r)/2; if(query(mid, idx)>sp[idx][0])l=mid+1; else r = mid-1; }return r; } }; int n,puedo=0; vi h; spt st;vi graph[N]; vi minDist[N]; void init(int sz, vi hj){n=sz;h=hj; st.make(h); fo(i,n){ // 4 pts son 4 pts if(h[i] <= (i==0 ? -16 : h[i-1]))puedo=0; int r = st.lwb(i, h[i]); int l = st.upb(i, h[i]); if(r<n)graph[i].pb(r); if(l>-1)graph[i].pb(l); } } int minimum_jumps(int A, int B, int C, int D) { if(puedo) return C - B; queue<int> q;vi minDist(n+1,1e9); fore(i, A, B+1){q.push(i);minDist[i]=0;} int ans = 1e9; while(q.size()){ int nodo = q.front();q.pop(); for(int v : graph[nodo]){ if(minDist[v] > minDist[nodo] +1 ){ minDist[v] = minDist[nodo] +1; q.push(v); } } }fore(i,C, D+1)ans = min(ans, minDist[i]); return (ans==1e9 ? -1 : 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...