結果
| 問題 | No.3756 Udon Network |
| ユーザー |
|
| 提出日時 | 2026-09-12 16:38:11 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
RE
不安定
|
| 実行時間 | - |
| コード長 | 1,743 bytes |
| 記録 | |
| コンパイル時間 | 2,328 ms |
| コンパイル使用メモリ | 351,404 KB |
| 実行使用メモリ | 9,920 KB |
| 最終ジャッジ日時 | 2026-10-09 17:44:32 |
| 合計ジャッジ時間 | 20,194 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge4_0 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| Example | 0 % | AC * 8 |
| Subtask $1$ | 2 % | AC * 15 |
| Subtask $2$ | 4 % | AC * 22 |
| Subtask $3$ | 8 % | AC * 3 RE * 6 |
| Subtask $4$ | 16 % | AC * 2 RE * 8 |
| Subtask $5$ | 32 % | AC * 3 RE * 7 |
| Subtask $6$ | 38 % | AC * 22 RE * 31 |
| 合計 | 4 * 6% = 24 点 |
ソースコード
// O(N^3 + QN log N)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#ifdef LOCAL
#include <debug.hpp>
#include <misc.hpp>
#else
#define debug(...)
#endif
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(20);
int N, M, Q;
cin >> N >> M >> Q;
assert(N <= 1000 && M <= 1000 && Q <= 5000);
vector<int> A(N), W;
for (int i = 0; i < N; i++) cin >> A[i];
constexpr int INF = (1 << 30) - 1;
vector dist(N, vector<int>(N, INF));
for (int i = 0; i < N; i++) dist[i][i] = 0;
for (int i = 0; i < M; i++) {
int u, v, w;
cin >> u >> v >> w, u--, v--;
dist[u][v] = dist[v][u] = w;
W.emplace_back(w);
}
vector<int> S(Q), C(Q);
for (int i = 0; i < Q; i++) cin >> S[i] >> C[i], S[i]--;
ranges::sort(W);
W.erase(ranges::unique(W).begin(), W.end());
for (int k = 0; k < N; k++) {
for (int from = 0; from < N; from++) {
for (int to = 0; to < N; to++) {
if (dist[from][k] == INF || dist[k][to] == INF) continue;
dist[from][to] = min(dist[from][to], max(dist[from][k], dist[k][to]));
}
}
}
auto solve = [&](int s, int c) -> int {
if (c == 1) return 0; // 店 s 到達で ok
int ok = ssize(W), ng = -1;
while (ok - ng > 1) {
int mid = midpoint(ok, ng);
unordered_set<int> K;
for (int t = 0; t < N; t++) {
if (dist[s][t] <= W[mid]) K.emplace(A[t]);
}
(ssize(K) >= c ? ok : ng) = mid;
}
return (ok == ssize(W) ? -1 : W[ok]);
};
for (int i = 0; i < Q; i++) cout << solve(S[i], C[i]) << "\n";
}