Submission #949008

#TimeUsernameProblemLanguageResultExecution timeMemory
949008vjudge1Rainforest Jumps (APIO21_jumps)C++17
21 / 100
776 ms486924 KiB
#include <bits/stdc++.h> #include "jumps.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=2e3+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; } }; struct sptmn{ vector<vi> sp;int n;sptmn(){} 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] = min(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 min(sp[l][lg], sp[(r- (1<<lg))+ 1][lg]); } }; int n; vi h; spt st;vi graph[N]; vi minDist[N]; vector<sptmn> stal; void init(int sz, vi hj){n=sz;h=hj; st.make(h);stal.resize(sz); fo(i,n){ 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); } fo(i,n){minDist[i].resize(n+1,1e9); queue<int> q;q.push(i); minDist[i][i]=0; while(q.size()){ auto nodo = q.front();q.pop(); for(int v : graph[nodo]){ if(minDist[i][v] > minDist[i][nodo]+1){ minDist[i][v] = minDist[i][nodo]+1; q.push(v); } } } stal[i].make(minDist[i]); } } int minimum_jumps(int A, int B, int C, int D) { int ans = 1e9; fore(i, A, B+1){ ans = min(ans, stal[i].query(C,D)); } 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...