結果
問題 |
No.2477 Drifting
|
ユーザー |
|
提出日時 | 2023-09-23 21:42:55 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 414 ms / 2,000 ms |
コード長 | 1,676 bytes |
コンパイル時間 | 2,749 ms |
コンパイル使用メモリ | 186,328 KB |
実行使用メモリ | 61,416 KB |
最終ジャッジ日時 | 2024-07-16 21:32:05 |
合計ジャッジ時間 | 7,899 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 14 |
ソースコード
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define fi first #define se second const ll mod=998244353; const int N=2e5+5; ll n,m,k,z,y; int eu[N],ev[N]; ll ew[N]; ll d[N]; vector<pair<int,int> >in[N],out[N]; int sz=0; vector<int>g[N]; map<int,vector<int> >ban[N]; ll jp[N]; ll mn[1<<19]; void build(int id,int l,int r){ if(l==r){ mn[id]=d[in[y][l-1].se]; return; } int mid=(l+r)/2; build(id*2,l,mid); build(id*2+1,mid+1,r); mn[id]=min(mn[id*2],mn[id*2+1]); } ll qry(int id,int l,int r,int ql,int qr){ if(l>qr || r<ql) return 1e18; if(ql<=l && r<=qr) return mn[id]; int mid=(l+r)/2; return min(qry(id*2,l,mid,ql,qr),qry(id*2+1,mid+1,r,ql,qr)); } int main(){ ios::sync_with_stdio(false);cin.tie(0); cin >> n >> m; for(int i=1; i<=m ;i++){ int u,v;ll w;cin >> u >> v >> w; eu[i]=u;ev[i]=v;ew[i]=w; in[v].push_back({u,i}); out[u].push_back({v,i}); d[i]=1e18; } in[1].push_back({0,0}); cin >> k; for(int i=1; i<=k ;i++){ int a,b,c;cin >> a >> b >> c; ban[b][c].push_back(a); } ll res=1e18; for(int i=1; i<=n ;i++){ if(in[i].empty()) continue; y=i; sort(in[i].begin(),in[i].end()); z=in[i].size(); for(int j=0; j<in[i].size() ;j++){ jp[in[i][j].fi]=j+1; } build(1,1,z); for(auto c:out[i]){ auto &v=ban[i][c.fi]; vector<int>g; for(auto d:v){ if(jp[d]!=0) g.push_back(jp[d]); } sort(g.begin(),g.end()); int prv=0; ll cur=1e18; for(auto d:g){ if(prv+1<d) cur=min(cur,qry(1,1,z,prv+1,d-1)); prv=d; } if(prv+1<=z) cur=min(cur,qry(1,1,z,prv+1,z)); d[c.se]=cur+ew[c.se]; if(c.fi==n) res=min(res,d[c.se]); } } if(res==1e18) res=-1; cout << res << '\n'; }