Submission #954242

#TimeUsernameProblemLanguageResultExecution timeMemory
954242LCJLYBitaro's travel (JOI23_travel)C++14
0 / 100
1 ms604 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ld long double #define show(x,y) cout << y << " " << #x << endl; #define show2(x,y,i,j) cout << y << " " << #x << " " << j << " " << #i << endl; #define show3(x,y,i,j,p,q) cout << y << " " << #x << " " << j << " " << #i << " " << q << " " << #p << endl; #define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl; typedef pair<int,int>pii; typedef pair<pii,pii>pi2; mt19937 rng(chrono::system_clock::now().time_since_epoch().count()); struct SparseTable { vector<vector<int> > ST; int N, K; SparseTable(int _N, int a[]): N(_N) { K = MSB(N); ST.resize(K); ST[0] = vector<int>(a, a+N); for (int k = 1; k < K; ++k) for (int i = 0; i+(1<<k) <= N; ++i) ST[k].push_back( min(ST[k-1][i], ST[k-1][i+(1<<(k-1))]) ); } inline int MSB(unsigned int x) { return 32-__builtin_clz(x); } int query(int x, int y) { int k = MSB(y-x+1) - 1; return min(ST[k][x], ST[k][y-(1<<k)+1]); } }; struct SparseTable2 { vector<vector<int> > ST; int N, K; SparseTable2(int _N, int a[]): N(_N) { K = MSB(N); ST.resize(K); ST[0] = vector<int>(a, a+N); for (int k = 1; k < K; ++k) for (int i = 0; i+(1<<k) <= N; ++i) ST[k].push_back( max(ST[k-1][i], ST[k-1][i+(1<<(k-1))]) ); } inline int MSB(unsigned int x) { return 32-__builtin_clz(x); } int query(int x, int y) { int k = MSB(y-x+1) - 1; return max(ST[k][x], ST[k][y-(1<<k)+1]); } }; void solve(){ int n; cin >> n; int arr[n+5]; for(int x=1;x<=n;x++){ cin >> arr[x]; } arr[0]=-1e17; arr[n+1]=1e17; int r[n+5]; int l[n+5]; l[0]=1e15; r[n+1]=-1e15; for(int x=1;x<=n;x++){ l[x]=2*arr[x]-arr[x-1]; r[x]=2*arr[x]-arr[x+1]; } SparseTable2 st(n+2,l); SparseTable st2(n+2,r); int q; cin >> q; for(int x=0;x<q;x++){ int index; cin >> index; int cur=0; int hold=lower_bound(arr,arr+n+2,index)-arr; if(index-arr[hold-1]<=arr[hold]-index) cur=hold-1; else cur=hold; int counter=abs(index-arr[cur]); bool amos=true; if(arr[cur]-arr[cur-1]<=arr[cur+1]-arr[cur]) amos=false; int left=cur; int right=cur; while(left>1&&right<n){ if(amos){ //venture right int target=arr[left-1]; //modify //for(int y=cur+1;y<=n;y++){ //right=y; //if(r[y]<=target) break; //} int lft=cur; int rgt=n; int mid; int best=rgt; while(lft<=rgt){ //show2(lft,lft,rgt,rgt); mid=(lft+rgt)/2; if(st2.query(cur+1,mid)<=target){ best=mid; rgt=mid-1; } else lft=mid+1; } right=best; //modify counter+=abs(arr[left-1]-arr[right]); counter+=abs(arr[right]-arr[cur]); cur=left-1; left--; amos=false; } else{ //venture left int target=arr[right+1]; //modify //for(int y=cur-1;y>=1;y--){ //left=y; //if(l[y]>target) break; //} int lft=1; int rgt=cur; int mid; int best=lft; while(lft<=rgt){ //show2(lft,lft,rgt,rgt); mid=(lft+rgt)/2; if(st.query(mid,cur-1)>target){ best=mid; lft=mid+1; } else rgt=mid-1; } left=best; //modify counter+=abs(arr[left]-arr[right+1]); counter+=abs(arr[left]-arr[cur]); cur=right+1; right++; amos=true; } } if(left!=1){ counter+=abs(arr[cur]-arr[1]); } if(right!=n){ counter+=abs(arr[cur]-arr[n]); } cout << counter << "\n"; } } /* 10 1 2 3 4 5 6 7 8 9 10 1 2 */ int32_t main(){ ios::sync_with_stdio(0); cin.tie(0); int t=1; //cin >> t; while(t--){ solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...