Submission #485264

#TimeUsernameProblemLanguageResultExecution timeMemory
485264xiaowuc1주유소 (KOI16_gas)C++17
100 / 100
799 ms708 KiB
#include <algorithm> #include <array> #include <bitset> #include <cassert> #include <chrono> #include <cstring> #include <functional> #include <iomanip> #include <iostream> #include <map> #include <numeric> #include <queue> #include <random> #include <set> #include <stack> #include <unordered_map> #include <vector> using namespace std; // BEGIN NO SAD #define rep(i, a, b) for(int i = a; i < (b); ++i) #define trav(a, x) for(auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() #define mp make_pair #define pb push_back #define eb emplace_back #define lb lower_bound #define ub upper_bound typedef vector<int> vi; #define f first #define s second #define derr if(1) cerr // END NO SAD template<class Fun> class y_combinator_result { Fun fun_; public: template<class T> explicit y_combinator_result(T &&fun): fun_(std::forward<T>(fun)) {} template<class ...Args> decltype(auto) operator()(Args &&...args) { return fun_(std::ref(*this), std::forward<Args>(args)...); } }; template<class Fun> decltype(auto) y_combinator(Fun &&fun) { return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun)); } typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<vector<ll>> matrix; void solve() { int n, m; cin >> n >> m; vector<pii> gasprices(n); for(int i = 0; i < n; i++) { int x; cin >> x; gasprices[i] = {x, i}; } sort(all(gasprices)); vector<vector<pii>> edges(n); while(m--) { int a, b, w; cin >> a >> b >> w; a--; b--; edges[a].eb(b, w); edges[b].eb(a, w); } vector<ll> cost(n, 1e18); cost[0] = 0; while(sz(gasprices)) { auto [currp, src] = gasprices.back(); gasprices.pop_back(); vector<int> dp(n, 2e9); dp[src] = 0; priority_queue<pii> q; q.emplace(-dp[src], src); while(sz(q)) { auto [w, v] = q.top(); q.pop(); w *= -1; if(dp[v] != w) continue; for(auto [nv, gain]: edges[v]) { if(dp[v] + gain < dp[nv]) { dp[nv] = dp[v] + gain; q.emplace(-dp[nv], nv); } } } for(int i = 0; i < n; i++) { cost[i] = min(cost[i], cost[src] + dp[i] * (ll)currp); } } cout << cost[n-1] << "\n"; } // what would chika do // are there edge cases (N=1?) // are array sizes proper (scaled by proper constant, for example 2* for koosaga tree) // integer overflow? // DS reset properly between test cases // are you doing geometry in floating points // are you not using modint when you should int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#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...