結果
問題 |
No.2366 登校
|
ユーザー |
![]() |
提出日時 | 2025-08-14 12:34:54 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,682 bytes |
コンパイル時間 | 2,415 ms |
コンパイル使用メモリ | 214,144 KB |
実行使用メモリ | 822,292 KB |
最終ジャッジ日時 | 2025-08-14 12:35:09 |
合計ジャッジ時間 | 13,939 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | MLE * 1 -- * 1 |
other | -- * 26 |
ソースコード
//E #include <bits/stdc++.h> using namespace std; typedef long long ll; ll n, m, k, t; vector<ll> C, D; vector<bool> isTree; ll Edge; bool feasible(ll F) { //tandain pohon yg bisa dipakai vector<char> allow(Edge, 0); bool exist = false; for(ll i = 0; i<Edge; i++) { if(isTree[i] && D[i]<=F) { allow[i] = 1; if(C[i]>1) { exist = true; } } } //kl ada pohon dgn C>1, bisa kurangin waktu infinite //Jika semua C <= 1 Dijkstra vector<ll> dist(Edge, (1LL<<60)); dist[0] = 0; priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll>>> pq; pq.push({0, 0}); ll row[4] = {-1, 1, 0, 0}; ll col[4] = {0, 0, -1, 1}; ll target = (n-1)*m + (m-1); //mau ngebuat grid 2D >> 1D while(!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); if(d != dist[u]) continue; if(u == target) break; ll r = u/m, c = u%m; //move ke tetangga for(ll k = 0; k<4; k++) { ll move_r = r+row[k], move_c = c+col[k]; if(move_r<0||move_r>=n||move_c<0||move_c>=m) continue; ll v = move_r * m + move_c; ll nd = d+1; if(dist[v] > nd) { dist[v] = nd; pq.push({nd, v}); } } //cek self loop if(allow[u]) { ll w = 1-C[u]; ll nd = d+w; if(dist[u] > nd) { dist[u] = nd; pq.push({nd, u}); } } } if(exist && dist[target] <= t) return true; return dist[target] <= t; } int main() { cin>>n>>m>>k>>t; Edge = n*m; C.assign(Edge, 0); D.assign(Edge, LLONG_MAX); isTree.assign(Edge, false); vector<ll> allD; for(ll i = 0; i<k; i++) { ll a, b, c, d; cin>>a>>b>>c>>d; --a; --b; //1 based index ll idx = a*m + b; // ubah ke 1D isTree[idx] = true; C[idx] = c; D[idx] = d; allD.push_back(d); } ll dist_min = (n-1)+(m-1); if(dist_min <= t){ cout<<0; return 0; } if(k==0) { //dist_min>t dan k == 0 -> tdk ada pohon cout<<-1; return 0; } sort(allD.begin(), allD.end()); allD.erase(unique(allD.begin(), allD.end()), allD.end()); //BS ll l = 0, r = allD.size()-1; ll ans = -1; while(l<=r) { ll mid = (l+r)/2; ll val = allD[mid]; if(feasible(val)) { ans = val; r = mid-1; } else{ l = mid+1; } } cout<<ans; }