Submission #1291411

#TimeUsernameProblemLanguageResultExecution timeMemory
1291411MMihalevSky Walking (IOI19_walk)C++20
0 / 100
14 ms2620 KiB
#include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include "walk.h" using namespace std; const int MAX_N=2e6+5; const long long INF=(1LL<<61); int N; int sz; map<int,int>pos; void position(int x) { if(pos.find(x)==pos.end()) { pos[x]=sz; sz++; } } long long tree[4*MAX_N][2]; void Init(int node,int l,int r) { tree[node][0]=INF; tree[node][1]=INF; if(l==r)return; int mid=(l+r)/2; Init(2*node,l,mid); Init(2*node+1,mid+1,r); } void update(int node,int l,int r,int idx,long long val,int wh) { if(l==r) { tree[node][wh]=val; return; } int mid=(l+r)/2; if(idx<=mid)update(2*node,l,mid,idx,val,wh); else update(2*node+1,mid+1,r,idx,val,wh); tree[node][wh]=min(tree[2*node][wh],tree[2*node+1][wh]); } long long query(int node,int l,int r,int ql,int qr,int wh) { if(ql<=l && r<=qr) { return tree[node][wh]; } int mid=(l+r)/2; long long ans=INF; if(ql<=mid)ans=query(2*node,l,mid,ql,qr,wh); if(mid+1<=qr)ans=min(ans,query(2*node+1,mid+1,r,ql,qr,wh)); return ans; } long long min_distance(std::vector<int> x, std::vector<int> h, std::vector<int> l, std::vector<int> r, std::vector<int> y, int s, int g) { N=x.size(); if(N==1)return 0; sz=0; for(int i=0;i<y.size();i++) { position(y[i]); } sz--; vector<pair<pair<int,int>,int>>fakeinters; for(int i=0;i<l.size();i++) { fakeinters.push_back({{r[i],l[i]},i}); } sort(fakeinters.begin(),fakeinters.end()); vector<pair<pair<int,int>,int>>inters; for(int i=0;i<l.size();i++) { if(inters.size()) { if(inters.back().first.first==fakeinters[i].first.first) { continue; } while(inters.size() && inters.back().first.second>=fakeinters[i].first.second) { inters.pop_back(); } } inters.push_back(fakeinters[i]); } Init(1,0,sz); deque<int>active; active.push_back(inters[0].second); update(1,0,sz,pos[y[inters[0].second]],2LL*y[inters[0].second],+1); update(1,0,sz,pos[y[inters[0].second]],0LL,0); if(inters.size()==1) { if(inters[0].first.first==N-1 && inters[0].first.second==0) { return 2LL*y[inters[0].second]+1LL*x[N-1]-1LL*x[0]; } return -1; } if(inters[0].first.second!=0)return -1; for(int i=1;i<inters.size();i++) { int id=inters[i].second; while(active.size() && r[active.front()]<l[id]) { int id2=active.front(); update(1,0,sz,pos[y[id2]],INF,+1); update(1,0,sz,pos[y[id2]],INF,0); active.pop_front(); } if(active.size()==0)return -1; long long val=query(1,0,sz,pos[y[id]],sz,+1)-1LL*y[id]; val=min(val,query(1,0,sz,0,pos[y[id]],0)+1LL*y[id]); if(i==inters.size()-1) { if(r[id]!=N-1)return -1; return 1LL*x[N-1]-1LL*x[0]+val+1LL*y[id]; } update(1,0,sz,pos[y[id]],val+1LL*y[id],+1); update(1,0,sz,pos[y[id]],val-1LL*y[id],0); active.push_back(id); } }

Compilation message (stderr)

walk.cpp: In function 'long long int min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:143:1: warning: control reaches end of non-void function [-Wreturn-type]
  143 | }
      | ^
#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...