結果
問題 | No.2764 Warp Drive Spacecraft |
ユーザー | Rubikun |
提出日時 | 2024-05-17 22:07:35 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 368 ms / 3,000 ms |
コード長 | 3,302 bytes |
コンパイル時間 | 2,727 ms |
コンパイル使用メモリ | 220,868 KB |
実行使用メモリ | 28,320 KB |
最終ジャッジ日時 | 2024-07-17 20:23:29 |
合計ジャッジ時間 | 10,450 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 6 ms
10,496 KB |
testcase_01 | AC | 5 ms
10,368 KB |
testcase_02 | AC | 6 ms
10,368 KB |
testcase_03 | AC | 6 ms
10,496 KB |
testcase_04 | AC | 6 ms
10,496 KB |
testcase_05 | AC | 6 ms
10,624 KB |
testcase_06 | AC | 6 ms
10,496 KB |
testcase_07 | AC | 6 ms
10,368 KB |
testcase_08 | AC | 5 ms
10,368 KB |
testcase_09 | AC | 6 ms
10,496 KB |
testcase_10 | AC | 7 ms
10,624 KB |
testcase_11 | AC | 7 ms
10,368 KB |
testcase_12 | AC | 7 ms
10,752 KB |
testcase_13 | AC | 7 ms
10,624 KB |
testcase_14 | AC | 6 ms
10,496 KB |
testcase_15 | AC | 6 ms
10,496 KB |
testcase_16 | AC | 121 ms
24,448 KB |
testcase_17 | AC | 120 ms
24,192 KB |
testcase_18 | AC | 118 ms
24,192 KB |
testcase_19 | AC | 255 ms
24,704 KB |
testcase_20 | AC | 259 ms
26,052 KB |
testcase_21 | AC | 255 ms
25,124 KB |
testcase_22 | AC | 255 ms
25,884 KB |
testcase_23 | AC | 250 ms
24,832 KB |
testcase_24 | AC | 260 ms
25,920 KB |
testcase_25 | AC | 260 ms
26,012 KB |
testcase_26 | AC | 360 ms
27,968 KB |
testcase_27 | AC | 354 ms
27,896 KB |
testcase_28 | AC | 363 ms
28,180 KB |
testcase_29 | AC | 365 ms
28,100 KB |
testcase_30 | AC | 347 ms
28,020 KB |
testcase_31 | AC | 368 ms
28,320 KB |
testcase_32 | AC | 364 ms
28,308 KB |
testcase_33 | AC | 119 ms
21,928 KB |
testcase_34 | AC | 125 ms
21,940 KB |
testcase_35 | AC | 122 ms
21,944 KB |
testcase_36 | AC | 125 ms
24,320 KB |
testcase_37 | AC | 131 ms
23,956 KB |
testcase_38 | AC | 107 ms
22,144 KB |
コンパイルメッセージ
main.cpp:25:9: warning: #pragma once in main file 25 | #pragma once | ^~~~
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; } template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; } #define all(x) (x).begin(),(x).end() #define fi first #define se second #define mp make_pair #define si(x) int(x.size()) const int mod=998244353,MAX=300005; const ll INF=15LL<<58; /** * Author: Simon Lindholm * Date: 2017-04-20 * License: CC0 * Source: own work * Description: Container where you can add lines of the form kx+m, and query maximum values at points x. * Useful for dynamic programming (``convex hull trick''). * Time: O(\log N) * Status: stress-tested */ #pragma once struct Line { mutable ll k, m, p; bool operator<(const Line& o) const { return k < o.k; } bool operator<(ll x) const { return p < x; } }; struct LineContainerMIN : multiset<Line, less<>> { // (for doubles, use inf = 1/.0, div(a,b) = a/b) static const ll inf = LLONG_MAX; ll div(ll a, ll b) { // floored division return a / b - ((a ^ b) < 0 && a % b); } bool isect(iterator x, iterator y) { if (y == end()) return x->p = inf, 0; if (x->k == y->k) x->p = x->m > y->m ? inf : -inf; else x->p = div(y->m - x->m, x->k - y->k); return x->p >= y->p; } void add(ll k, ll m) { k*=-1;m*=-1; auto z = insert({k, m, 0}), y = z++, x = y; while (isect(y, z)) z = erase(z); if (x != begin() && isect(--x, y)) isect(x, y = erase(y)); while ((y = x) != begin() && (--x)->p >= y->p) isect(x, erase(y)); } ll query(ll x) { assert(!empty()); auto l = *lower_bound(x); return -(l.k * x + l.m); } }; ll dis1[MAX],dis2[MAX]; vector<pair<int,ll>> G[MAX]; int main(){ std::ifstream in("text.txt"); std::cin.rdbuf(in.rdbuf()); cin.tie(0); ios::sync_with_stdio(false); ll N,M;cin>>N>>M; vector<ll> W(N); for(int i=0;i<N;i++) cin>>W[i]; for(int i=0;i<M;i++){ ll a,b,c;cin>>a>>b>>c;a--;b--; G[a].push_back(mp(b,c)); G[b].push_back(mp(a,c)); } for(int i=0;i<N;i++){ dis1[i]=INF; dis2[i]=INF; } { dis1[0]=0; priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<pair<ll,ll>>> PQ; PQ.push(mp(0,0)); while(!PQ.empty()){ auto [d,u]=PQ.top();PQ.pop(); if(dis1[u]<d) continue; for(auto [to,co]:G[u]){ if(chmin(dis1[to],dis1[u]+co)) PQ.push(mp(dis1[to],to)); } } } { dis2[N-1]=0; priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<pair<ll,ll>>> PQ; PQ.push(mp(0,N-1)); while(!PQ.empty()){ auto [d,u]=PQ.top();PQ.pop(); if(dis2[u]<d) continue; for(auto [to,co]:G[u]){ if(chmin(dis2[to],dis2[u]+co)) PQ.push(mp(dis2[to],to)); } } } ll ans=dis1[N-1]; LineContainerMIN cht; for(int i=0;i<N;i++){ cht.add(W[i],dis2[i]); } for(int i=0;i<N;i++){ chmin(ans,cht.query(W[i])+dis1[i]); } cout<<ans<<endl; }