이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "walk.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef pair<ll,ll> P;
typedef tuple<ll,ll,ll> PP;
typedef vector<P> vp;
typedef vector<vp> vvp;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,k,n) for(ll i=(ll)(k);i<(ll)(n);i++)
#define pb emplace_back
#define all(a) a.begin(),a.end()
#define dupli(a) {sort(all(a));a.erase(unique(all(a)),a.end());}
#define SPQ(a) priority_queue<a,vector<a>,greater<a>>
#define fi first
#define se second
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<class T> void outvp(T v){rep(i,v.size()){cout<<'('<<v[i].fi<<','<<v[i].se<<')';}cout<<endl;}
const ll inf=1001001001001001001;
ll dijkstra(ll n,vector<PP> edge,ll from,ll to){
vvp g(n);
for(auto x:edge){
ll a,b,c;tie(a,b,c)=x;
g[a].pb(b,c);g[b].pb(a,c);
}
SPQ(P) pq;pq.emplace(0,from);
vi dis(n,inf);dis[from]=0;
while(!pq.empty()){
auto t=pq.top();pq.pop();
if(dis[t.se]!=t.fi)continue;
for(auto x:g[t.se])if(chmin(dis[x.fi],t.fi+x.se))pq.emplace(dis[x.fi],x.fi);
}
if(dis[to]==inf)return -1;
return dis[to];
}
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 from, int to) {
ll n=x.size(),m=l.size();
set<P> S;
vvi L(n),R(n);
rep(i,m)L[l[i]].pb(i);
rep(i,m)R[r[i]].pb(i);
ll cnt=0,F,T;
vvp yoko(m);
vector<PP> edge;
rep(i,n){
vp sp;
for(ll t:L[i])S.insert(P(y[t],t));
for(ll t:L[i]){
sp.pb(y[t],t);
auto itr=S.lower_bound(P(y[t],t));
if(itr!=S.begin()){
itr--;sp.pb(*itr);
}
}
for(ll t:R[i]){
sp.pb(y[t],t);
auto itr=S.lower_bound(P(y[t],t));
if(itr!=S.begin()){
itr--;sp.pb(*itr);
}
}
if(S.size())sp.pb(*S.begin());
sp.pb(0,-1);
for(ll t:R[i])S.erase(P(y[t],t));
dupli(sp);
while(sp.size()&&sp.back().fi>h[i])sp.pop_back();
rep(j,sp.size()-1){
edge.pb(cnt+j,cnt+j+1,sp[j+1].fi-sp[j].fi);
}
REP(j,1,sp.size())yoko[sp[j].se].pb(i,cnt+j);
if(from==i)F=cnt;
if(to==i)T=cnt;
cnt+=sp.size();
}
rep(i,m)rep(j,yoko[i].size()-1)edge.pb(yoko[i][j].se,yoko[i][j+1].se,x[yoko[i][j+1].fi]-x[yoko[i][j].fi]);
return dijkstra(cnt,edge,F,T);
}
컴파일 시 표준 에러 (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:79:17: warning: 'F' may be used uninitialized in this function [-Wmaybe-uninitialized]
79 | return dijkstra(cnt,edge,F,T);
| ~~~~~~~~^~~~~~~~~~~~~~
walk.cpp:79:17: warning: 'T' may be used uninitialized in this function [-Wmaybe-uninitialized]
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |