제출 #1316081

#제출 시각아이디문제언어결과실행 시간메모리
1316081vlomaczkEscape Route (JOI21_escape_route)C++20
컴파일 에러
0 ms0 KiB
#include "escape_route.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> typedef long long ll; using namespace __gnu_pbds; using namespace std; template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; std::vector<long long> calculate_necessary_time( ll N, ll M, long long S, ll Q, std::vector<ll> A, std::vector<ll> B, std::vector<long long> L, std::vector<long long> C, std::vector<ll> U, std::vector<ll> V, std::vector<long long> T) { vector<ll> K(M); for(ll i=0; i<M; ++i) K[i] = C[i] - L[i]; vector<ll> ans(Q); vector<vector<ll>> queries(N); for(ll i=0; i<Q; ++i) { queries[U[i]].push_back(i); } vector<vector<pair<ll, ll>>> g(N); for(ll i=0; i<M; ++i) { g[A[i]].push_back({B[i], i}); g[B[i]].push_back({A[i], i}); } ll inf = 1e18; auto get_dists = [&](ll s) { vector<ll> dist(N, inf), vis(N,0); dist[s] = 0; while(1) { pair<ll, ll> best = {inf,0}; for(ll i=0; i<N; ++i) if(!vis[i]) best = min(best, {dist[i], i}); if(best.first == inf) break; auto[dv,v] = best; vis[v] = 1; for(auto[u,k] : g[v]) { ll w = L[k]; ll t = dv%S; if(t > K[k]) w += S-t; if(dist[u] > dist[v] + w) { dist[u] = dist[v] + w; } } } return dist; }; vector<vector<ll>> dist(N); for(ll i=0; i<N; ++i) dist[i] = get_dists(i); for(ll i=0; i<N; ++i) sort(g[i].begin(), g[i].end(), [&](pair<ll, ll> x, pair<ll, ll> y){ return K[x.second] < K[y.second]; }); vector<vector<pair<ll, ll>>> oldg = g; for(ll s=0; s<N; ++s) { g = oldg; sort(queries[s].begin(), queries[s].end(), [&](ll i, ll j) { return T[i] > T[j]; }); vector<ll> best(M, S), parent(M,-1); vector<ll> green; vector<set<ll>> got(M); auto zmien = [&](ll x, ll diff){ queue<ll> pq; pq.push(x); while(pq.size()) { ll v = pq.front(); pq.pop(); best[v] -= diff; for(auto u : got[v]) pq.push(u); } }; green.push_back(s); best[s] = S; for(auto idx : queries[s]) { ll res = inf; ll diff = best[s] - T[idx]; for(auto x : green) best[x] -= diff; queue<ll> Q; for(auto x : green) Q.push(x); while(Q.size()) { ll x = Q.front(); Q.pop(); while(g[x].size()) { auto[u,i] = g[x].back(); if(best[x] <= K[i]) { if(best[u]==S) { green.push_back(u); } Q.push(u); if(best[u] > best[x] + L[i]) { ll DD = best[u] - (best[x] + L[i]); zmien(u,DD); if(parent[u]!=-1) got[parent[u]].erase(u); got[x].insert(u); parent[u] = x; } g[x].pop_back(); } else break; } } // for(ll i=0; i<N; ++i) cout << best[i] << " "; cout << "\n"; for(auto x : green) { if(x==V[idx]) { res = min(res, best[x]); } res = min(res, (best[x]==0 ? 0 : S) + dist[x][V[idx]]); } ans[idx] = res - T[idx]; } } return ans; } int main() { ll n,m,s,q; cin >> n >> m >> s >> q; vector<ll> A(m),B(m); vector<ll> L(m),C(m); for(ll i=0; i<m; ++i) cin >> A[i] >> B[i] >> L[i] >> C[i]; vector<ll> U(q), V(q); vector<ll> T(q); for(ll i=0; i<q; ++i) cin >> U[i] >> V[i] >> T[i]; for(auto x : calculate_necessary_time(n,m,s,q,A,B,L,C,U,V,T)) { cout << x << "\n"; } }

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccoUui5Q.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cccWAfnx.o:escape_route.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccoUui5Q.o: in function `main':
grader.cpp:(.text.startup+0x616): undefined reference to `calculate_necessary_time(int, int, long long, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<long long, std::allocator<long long> >, std::vector<long long, std::allocator<long long> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<long long, std::allocator<long long> >)'
collect2: error: ld returned 1 exit status