Submission #1038008

#TimeUsernameProblemLanguageResultExecution timeMemory
1038008AndreyRainforest Jumps (APIO21_jumps)C++14
0 / 100
5 ms14932 KiB
#include "jumps.h" #include<bits/stdc++.h> #include <vector> using namespace std; int n; vector<int> haha(200010); vector<int> lb(200001); vector<int> rb(200001); vector<pair<int,int>> seg(1000001); int big[200001][18]; int sm[200001][18]; int wow[200001][18]; void build(int l, int r, int x) { if(l == r) { seg[x] = {haha[l],l}; return; } int mid = (l+r)/2; build(l,mid,x*2); build(mid+1,r,x*2+1); seg[x] = max(seg[x*2],seg[x*2+1]); } pair<int,int> dude(int l, int r, int ql, int qr, int x) { if(l == ql && r == qr) { return seg[x]; } int mid = (l+r)/2; if(qr <= mid) { return dude(l,mid,ql,qr,x*2); } else if(ql > mid) { return dude(mid+1,r,ql,qr,x*2+1); } else { return max(dude(l,mid,ql,mid,x*2),dude(mid+1,r,mid+1,qr,x*2+1)); } } void calc(int x) { stack<pair<int,int>> idk; for(int i = 0; i < n; i++) { while(!idk.empty() && idk.top().first < haha[i]) { idk.pop(); } int c; if(idk.empty()) { c = n; } else { if(x == 0) { c = idk.top().second; } else { c = n-idk.top().second-1; } } if(x == 0) { lb[i] = c; } else { rb[n-i-1] = c; } idk.push({haha[i],i}); } } void init(int N, std::vector<int> H) { n = N; haha[n] = 0; lb[n] = n; rb[n] = n; for(int i = 0; i < n; i++) { haha[i] = H[i]; } calc(0); for(int i = 0; i < n/2; i++) { swap(haha[i],haha[n-i-1]); } calc(1); for(int i = 0; i < n/2; i++) { swap(haha[i],haha[n-i-1]); } for(int i = 0; i <= n; i++) { if(haha[lb[i]] > haha[rb[i]]) { big[i][0] = lb[i]; sm[i][0] = rb[i]; } else { big[i][0] = rb[i]; sm[i][0] = lb[i]; } wow[i][0] = rb[i]; } for(int i = 1; i < 18; i++) { for(int j = 0; j <= n; j++) { big[j][i] = big[big[j][i-1]][i-1]; sm[j][i] = sm[sm[j][i-1]][i-1]; wow[j][i] = wow[wow[j][i-1]][i-1]; } } build(0,n-1,1); } int minimum_jumps(int a, int b, int c, int d) { int p = dude(0,n-1,c,d,1).second; int q = lb[p]; if(q == n) { q = -1; } a = max(a,q+1); if(a > b) { return -1; } int y = dude(0,n-1,a,b,1).second; for(int i = 0; i < 2000000; i++) { if(wow[c][0] != n && lb[wow[c][0]] >= y && lb[wow[c][0]] != n && wow[c][0] <= d) { c = wow[c][0]; } else { break; } } if(lb[c] >= y && lb[c] != n) { c = wow[c][0]; } int x = y,ans = 0; cout << x << " " << c << endl; for(int i = 17; i >= 0; i--) { if(big[x][i] != n && haha[big[x][i]] <= haha[c]) { x = big[x][i]; ans+=(1 << i); } } for(int i = 17; i >= 0; i--) { if(sm[x][i] != n && haha[sm[x][i]] <= haha[c]) { x = sm[x][i]; ans+=(1 << i); } } if(haha[x] == haha[c]) { 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...