結果
問題 | No.2764 Warp Drive Spacecraft |
ユーザー |
👑 |
提出日時 | 2024-04-29 02:04:01 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,780 bytes |
コンパイル時間 | 5,144 ms |
コンパイル使用メモリ | 270,096 KB |
最終ジャッジ日時 | 2025-02-21 09:24:54 |
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 WA * 3 |
other | AC * 9 WA * 26 |
ソースコード
#include<bits/stdc++.h>#include<atcoder/all>#define rep(i,n) for(int i=0;i<n;i++)using namespace std;using namespace atcoder;typedef long long ll;typedef vector<int> vi;typedef vector<long long> vl;typedef vector<vector<int>> vvi;typedef vector<vector<long long>> vvl;typedef long double ld;typedef pair<int, int> P;ostream& operator<<(ostream& os, const modint& a) {os << a.val(); return os;}template <int m> ostream& operator<<(ostream& os, const static_modint<m>& a) {os << a.val(); return os;}template <int m> ostream& operator<<(ostream& os, const dynamic_modint<m>& a) {os << a.val(); return os;}template<typename T> istream& operator>>(istream& is, vector<T>& v){int n = v.size(); assert(n > 0); rep(i, n) is >> v[i]; return is;}template<typename U, typename T> ostream& operator<<(ostream& os, const pair<U, T>& p){os << p.first << ' ' << p.second; return os;}template<typename T> ostream& operator<<(ostream& os, const vector<T>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : " "); returnos;}template<typename T> ostream& operator<<(ostream& os, const vector<vector<T>>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : "");return os;}template<typename T> void chmin(T& a, T b){a = min(a, b);}template<typename T> void chmax(T& a, T b){a = max(a, b);}// thanks for Luzhiled-san's website// https://ei1333.github.io/luzhiled/snippets/structure/convex-hull-trick-add-monotone.htmltemplate< typename T, bool isMin >struct ConvexHullTrickAddMonotone {#define F first#define S secondusing P = pair< T, T >;deque< P > H;ConvexHullTrickAddMonotone() = default;bool empty() const { return H.empty(); }void clear() { H.clear(); }inline int sgn(T x) { return x == 0 ? 0 : (x < 0 ? -1 : 1); }using D = long double;inline bool check(const P &a, const P &b, const P &c) {if(b.S == a.S || c.S == b.S)return sgn(b.F - a.F) * sgn(c.S - b.S) >= sgn(c.F - b.F) * sgn(b.S - a.S);//return (b.F-a.F)*(c.S-b.S) >= (b.S-a.S)*(c.F-b.F);returnD(b.F - a.F) * sgn(c.S - b.S) / D(abs(b.S - a.S)) >=D(c.F - b.F) * sgn(b.S - a.S) / D(abs(c.S - b.S));}void add(T a, T b) {if(!isMin) a *= -1, b *= -1;P line(a, b);if(empty()) {H.emplace_front(line);return;}if(H.front().F <= a) {if(H.front().F == a) {if(H.front().S <= b) return;H.pop_front();}while(H.size() >= 2 && check(line, H.front(), H[1])) H.pop_front();H.emplace_front(line);} else {assert(a <= H.back().F);if(H.back().F == a) {if(H.back().S <= b) return;H.pop_back();}while(H.size() >= 2 && check(H[H.size() - 2], H.back(), line)) H.pop_back();H.emplace_back(line);}}inline T get_y(const P &a, const T &x) {return a.F * x + a.S;}T query_monotone_inc(T x) {assert(!empty());while(H.size() >= 2 && get_y(H.front(), x) >= get_y(H[1], x)) H.pop_front();if(isMin) return get_y(H.front(), x);return -get_y(H.front(), x);}#undef F#undef S};const long long INF = 2002002002002002002;using S = long long;S _INF(INF);S _ZERO(0LL);using F = long long;S apply(F f, S x){return f + x;}template<typename S, typename F>struct Dijkstra{struct Edge{int from, to;F cost;Edge(int from, int to, F cost) : from(from), to(to), cost(cost) {};};int n, m;vector<bool> initialized;vector<Edge> E;vector<vector<int>> G;map<int, vector<S>> dist;map<int, vector<int>> idx;Dijkstra(int _n) : n(_n), m(0), initialized(n, false), G(n){}void add_edge(int from, int to, F cost){Edge e(from, to, cost);E.push_back(e);G[from].emplace_back(m);m++;}void calc(int s){initialized[s] = true;dist[s] = vector<S>(n, _INF);idx[s] = vector<int>(n, -1);priority_queue<tuple<S, int, int>, vector<tuple<S, int, int>>, greater<tuple<S, int, int>>> pq;pq.emplace(_ZERO, s, -1);while(pq.size()){auto [dist_from, from, index] = pq.top(); pq.pop();if(dist[s][from] <= dist_from) continue;dist[s][from] = dist_from;idx[s][from] = index;for(int index : G[from]){int to = E[index].to;S dist_to = apply(E[index].cost, dist_from);if(dist[s][to] <= dist_to) continue;pq.emplace(dist_to, to, index);}}}S get_dist(int s, int t){if(!initialized[s]) calc(s);return dist[s][t];}};int main(){int n, m;cin >> n >> m;vector<long long> w(n);for(int i = 0; i < n; i++) cin >> w[i];Dijkstra<long long, long long> graph(n);for(int i = 0; i < m; i++){int u, v;long long t;cin >> u >> v >> t;u--; v--;graph.add_edge(u, v, t);graph.add_edge(v, u, t);}cout << graph.get_dist(0, n - 1) << "\n";return 0;}