結果
| 問題 |
No.2366 登校
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-08-14 12:31:08 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,683 bytes |
| コンパイル時間 | 3,164 ms |
| コンパイル使用メモリ | 211,060 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2025-08-14 12:31:12 |
| 合計ジャッジ時間 | 3,498 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 15 WA * 11 |
ソースコード
//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;
break;
}
}
}
//kl ada pohon dgn C>1, bisa kurangin waktu infinite
if(exist) return true;
//Jika semua C <= 1 Dijkstra
vector<ll> dist(Edge, LLONG_MAX);
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});
}
}
}
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;
}
vjudge1