Submission #1189576

#TimeUsernameProblemLanguageResultExecution timeMemory
1189576alexddSky Walking (IOI19_walk)C++20
0 / 100
28 ms20924 KiB
#include "walk.h" #include <bits/stdc++.h> using namespace std; #define int long long const int INF = 1e18; int n; vector<int32_t> h; vector<pair<int,int>> aint[400005]; void build(int nod, int st, int dr) { for(int i=st;i<=dr;i++) aint[nod].push_back({h[i],i}); sort(aint[nod].begin(),aint[nod].end()); reverse(aint[nod].begin(),aint[nod].end()); if(st==dr) return; int mij=(st+dr)/2; build(nod*2,st,mij); build(nod*2+1,mij+1,dr); } pair<int,int> qry(int nod, int st, int dr, int le, int ri, int lim) { if(le>ri) return {-1,-1}; if(le==st && dr==ri) { return aint[nod][0]; } int mij=(st+dr)/2; return max(qry(nod*2,st,mij,le,min(mij,ri),lim), qry(nod*2+1,mij+1,dr,max(mij+1,le),ri,lim)); } vector<int> incep[100005],termina[100005]; set<pair<int,int>> s; map<int,int> cnt; void baga(int x) { auto it = s.lower_bound({x,0}); if((*it).first == x) return; int mnm=INF; if(it != s.end()) mnm = min(mnm, (*it).second + abs((*it).first - x)); if(it != s.begin()) { it--; mnm = min(mnm, (*it).second + abs((*it).first - x)); } s.insert({x,mnm}); } long long min_distance(vector<int32_t> x, vector<int32_t> coph, vector<int32_t> l, vector<int32_t> r, vector<int32_t> y, int32_t src, int32_t g) { h = coph; n = h.size(); build(1,0,n-1); for(int i=0;i<l.size();i++) { pair<int,int> x = qry(1,0,n-1,l[i]+1,r[i]-1,y[i]); if(x.first > max(h[l[i]], h[r[i]]) && 0) { //assert(0); incep[l[i]].push_back(y[i]); termina[x.second].push_back(y[i]); incep[x.second].push_back(y[i]); termina[r[i]].push_back(y[i]); } else { incep[l[i]].push_back(y[i]); termina[r[i]].push_back(y[i]); } } assert(n!=1); s.insert({0,0}); cnt[0]++; termina[0].push_back(0); incep[n-1].push_back(0); for(int i=0;i<n;i++) { for(int x:incep[i]) { cnt[x]++; baga(x); } for(int x:termina[i]) { auto it = s.lower_bound({x,0}); assert(it != s.end() && (*it).first == x); cnt[x]--; if(cnt[x]==0) s.erase(it); } } assert(!s.empty()); auto cop = *s.begin(); if(cop.second == INF) return -1; return cop.second + x[n-1] - x[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...