Submission #1155367

#TimeUsernameProblemLanguageResultExecution timeMemory
1155367the_coding_poohSky Walking (IOI19_walk)C++20
24 / 100
2314 ms316304 KiB
#include "walk.h" #include <bits/stdc++.h> using namespace std; #define fs first #define sc second #define all(x) x.begin(), x.end() const int SIZE = 2e6 + 5; struct d_to_v{ long long d; int v; d_to_v (int _v, long long _d) : v(_v), d(_d) {}; d_to_v operator+(d_to_v d2){ return d_to_v(d2.v, d + d2.d); } }; vector <d_to_v> graph[SIZE]; bool cmp(d_to_v a, d_to_v b){ return a.d > b.d; } void Dijkstra(int S, vector <long long> &dist){ bitset <SIZE> been; priority_queue<d_to_v, vector<d_to_v>, decltype(&cmp)> pq(cmp); pq.push(d_to_v(S, 0)); while (!pq.empty()){ d_to_v tp = pq.top(); pq.pop(); if(been[tp.v]) continue; been[tp.v] = 1; dist[tp.v] = tp.d; for(auto i:graph[tp.v]){ if(been[i.v]) continue; pq.push(tp + i); } } return; } int ptr = 0; vector <pair<int, long long>> pt[SIZE]; map <pair<int, long long>, int> hpt; int idx(int a, long long b){ if(!hpt.count({a, b})) hpt[{a, b}] = ++ptr; return hpt[{a, b}]; } long long min_distance(vector<int> x, vector<int> h, vector<int> l, vector<int> r, vector<int> y, int s, int g) { int n = x.size(), m = l.size(); vector <pair<long long, pair<int, int>>> event; for (int i = 0; i < m; i++){ event.push_back({y[i], {l[i], r[i]}}); } set <int> sid; for (int i = 0; i < n; i++){ event.push_back({h[i] + 1, {-1, i}}); sid.insert(i); } sort(all(event)); for (auto e:event){ if(e.sc.fs == -1){ sid.erase(e.sc.sc); continue; } vector <int> id; for (auto t = sid.lower_bound(e.sc.fs); 1 ; t = next(t)){ id.push_back(*t); if(*t == e.sc.sc) break; } for (int j = 0; j < (int)id.size() - 1; j++){ graph[idx(id[j], e.fs)].push_back(d_to_v(idx(id[j + 1], e.fs), x[id[j + 1]] - x[id[j]])); graph[idx(id[j + 1], e.fs)].push_back(d_to_v(idx(id[j], e.fs), x[id[j + 1]] - x[id[j]])); } } idx(s, 0); idx(g, 0); for (auto i : hpt){ pt[i.fs.fs].push_back({i.sc, i.fs.sc}); } for (int i = 0; i < n; i++){ for (int j = 0; j < (int)pt[i].size() - 1; j++){ graph[pt[i][j].fs].push_back(d_to_v(pt[i][j + 1].fs, pt[i][j + 1].sc - pt[i][j].sc)); graph[pt[i][j + 1].fs].push_back(d_to_v(pt[i][j].fs, pt[i][j + 1].sc - pt[i][j].sc)); } } vector <long long> vec(ptr + 1, -1); Dijkstra(idx(s, 0), vec); return vec[idx(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...