Submission #1291409

#TimeUsernameProblemLanguageResultExecution timeMemory
1291409MMihalevSky Walking (IOI19_walk)C++20
0 / 100
228 ms186844 KiB
#include<iostream> #include<algorithm> #include<vector> #include<map> #include<iomanip> #include<cstring> #include<set> #include<queue> #include "walk.h" using namespace std; const int MAX_N=3e6+5; int N; int szx; int szpoints; map<pair<int,int>,int>pospoint; map<int,int>posx; set<int>pointsx[MAX_N]; int right[MAX_N]; int up[MAX_N]; void add_point(int x,int y) { if(pospoint.find({x,y})==pospoint.end()) { pospoint[{x,y}]=szpoints++; } pointsx[posx[x]].insert(y); } vector<pair<int,long long>>g[MAX_N]; long long dist[MAX_N]; void add_edge(int u,int v,int cost) { g[u].push_back({v,cost}); g[v].push_back({u,cost}); } long long dijkstra(int s,int t) { priority_queue<pair<long long,int>>q; q.push({0,s}); memset(dist,-1,sizeof(dist)); dist[s]=0; while(q.size()) { long long d=-q.top().first; int u=q.top().second; q.pop(); if(d>dist[u])continue; for(auto [v,edge]:g[u]) { if(dist[u]+edge<dist[v] or dist[v]==-1) { dist[v]=dist[u]+edge; q.push({-dist[v],v}); } } } return dist[t]; } 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; for(int i=0;i<x.size();i++) { if(posx.find(x[i])==posx.end()) { posx[x[i]]=szx++; } } for(int i=0;i<x.size();i++) { add_point(x[i],0); add_point(x[i],h[i]); add_edge(szpoints-1,szpoints-2,h[i]); } vector<pair<int,int>>order; for(int i=0;i<y.size();i++) { order.push_back({y[i],i}); } sort(order.begin(),order.end()); for(int id=0;id<l.size();id++) { int i=order[id].second; int prevx=-1,prevy; for(int j=l[i];j<=r[i];j++) { if(h[j]>=y[i]) { add_point(x[j],y[i]); } if(prevx!=-1) { add_edge(pospoint[{prevx,prevy}],pospoint[{x[j],y[i]}],x[j]-prevx); } auto it=pointsx[posx[x[j]]].lower_bound(y[i]); it--; int yy=((*it)); add_edge(pospoint[{x[j],yy}],pospoint[{x[j],y[i]}],y[i]-yy); prevx=x[j]; prevy=y[j]; } } return dijkstra(pospoint[{x[s],0}],pospoint[{x[g],0}]); }
#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...